java - 如何确定调用方法的位置

标签 java stack-trace

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

我不需要确切的类名,每次调用一个唯一的引用就足够了。在 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(()->{});

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

void methodToCall(IntFunction fun) {

}

并调用

methodToCall(a->1);

关于java - 如何确定调用方法的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39765777/

相关文章:

Java Socks 代理套接字错误

ruby - 我如何强制 Ruby 显示完整的堆栈跟踪?

c++ - 如何将 gdb 的完整堆栈跟踪传输到文件?

javascript - Firebug:Angular 堆栈跟踪不显示错误源(行号、文件)

java - 如何访问 VariableDeclarationStatement 中的 MethodInvocation

java - 如何在 Eclipse 中快速测试 Java 方法?

java - 如何在 GridView 中显示 URL 中的图像而不下载它们?

C++ Builder 异常 - StackTrace 为空?

c++ - 获取文件堆栈跟踪的工具

java - oracle.jdbc.driver.OracleDriver ClassNotFoundException 异常