我提供了一个 API 并且需要知道在何处调用了 API 的方法。我当然可以使用反射或线程堆栈跟踪,但这会包含很多运行时成本。
我不需要确切的类名,每次调用一个唯一的引用就足够了。在 C 中,我通常会使用预处理器自动将 __FILE__
和 __LINE__
添加到方法调用中。
Java 中是否有一种方法(除了代码生成之外)以较低的运行成本获得唯一的调用者标识?
最佳答案
一个解决方案是拥有一个传入的缓存 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);
关于java - 如何确定调用方法的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39765777/