如何确定调用方法的位置

How to determine where method was called

我提供了一个 API 并且需要知道在何处调用了 API 的方法。我当然可以使用反射或线程堆栈跟踪,但这会包含很多运行时成本。

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

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

一个解决方案是拥有一个传入的缓存 Thr​​owable。

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(()->{});

这将为调用它的每个地方创建一个不同的 class,即使它在同一行中出现多次也是如此。它不会产生垃圾,因为它每次都重复使用相同的对象。你可以用

缩短它
void methodToCall(IntFunction fun) {

}

并致电

methodToCall(a->1);

由于涉及到一些异步的东西,把调用分开,让API return ID。

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

上面的结果 returned(同步)可能不是您的代码的情况。您的代码会将结果传递到其他地方。但这也可能是一个票务系统。