如何确定调用方法的位置

时间:2016-09-29 08:56:20

标签: java stack-trace

我提供了一个API,需要知道调用API的方法。我可以使用反射或线程堆栈跟踪,但这将包括大量的运行时成本。

我不需要确切的类名,每次调用一个唯一的引用就足够了。在C中,我通常会使用预处理器自动将__FILE____LINE__添加到方法调用中。

Java中是否存在一种方法(除了代码生成)以获得具有低运行时成本的唯一调用者标识?

2 个答案:

答案 0 :(得分:3)

一种解决方案是传入一个缓存的Throwable。

class StackPoint {
    Throwable stack;
    public Throwable getStack() {
        if (stack == null)
            stack = new Throwable();
        return stack;
    }
}

public void methodToCall(StackPoint sp) {
    Throwable t = sp.getStack();

}


static final StackPoint one = new StackPoint();

methodToCall(one); // Have to remember to give each line a different StackPoint.

注意:如果调用此调用者的方法发生更改,则只记录第一个调用者。

没有标准模式,如果您希望这种模式有效,则调用者可能需要传递唯一ID。你最接近的是使用lambda。

public void methodToCall(Runnable run) {
    Class id = run.getClass();

}

你可以这样称呼它

methodtoCall(()->{});

这将为每个被调用的地方创建一个不同的类,即使它在同一行上多次出现。它不会创建垃圾,因为它每次都重用相同的对象。你可以用

缩短这个
void methodToCall(IntFunction fun) {

}

并致电

methodToCall(a->1);

答案 1 :(得分:1)

由于涉及异步,请分开调用,让API返回ID。

Ticket callTicket = api.call(params);
Logger.getLogger(getClass().getName(), Level.FINE, callTicket);
Result result = callTicket.get();

以上返回(同步)的结果可能与您的代码不同。您的代码将在其他地方提供结果。但这也可能是一个票务系统。