我提供了一个API,需要知道调用API的方法。我可以使用反射或线程堆栈跟踪,但这将包括大量的运行时成本。
我不需要确切的类名,每次调用一个唯一的引用就足够了。在C中,我通常会使用预处理器自动将__FILE__
和__LINE__
添加到方法调用中。
Java中是否存在一种方法(除了代码生成)以获得具有低运行时成本的唯一调用者标识?
答案 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();
以上返回(同步)的结果可能与您的代码不同。您的代码将在其他地方提供结果。但这也可能是一个票务系统。