如何确定调用方法的位置
How to determine where method was called
我提供了一个 API 并且需要知道在何处调用了 API 的方法。我当然可以使用反射或线程堆栈跟踪,但这会包含很多运行时成本。
我不需要确切的 class 名称,每次调用一个唯一的引用就足够了。在 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(()->{});
这将为调用它的每个地方创建一个不同的 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(同步)可能不是您的代码的情况。您的代码会将结果传递到其他地方。但这也可能是一个票务系统。
我提供了一个 API 并且需要知道在何处调用了 API 的方法。我当然可以使用反射或线程堆栈跟踪,但这会包含很多运行时成本。
我不需要确切的 class 名称,每次调用一个唯一的引用就足够了。在 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(()->{});
这将为调用它的每个地方创建一个不同的 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(同步)可能不是您的代码的情况。您的代码会将结果传递到其他地方。但这也可能是一个票务系统。