Java:如何获取调用方函数名称

2022-09-01 02:54:48

为了修复测试用例,我需要确定该函数是否从特定的调用函数调用。我无法添加布尔参数,因为它会破坏定义的接口。如何做到这一点?

这就是我想要实现的目标。在这里,我无法更改operation()的参数,因为它是一个接口实现。

operation()
{
   if not called from performancetest() method
       do expensive bookkeeping operation
   ...       

}

答案 1

你可以试试

StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stacktrace[2];//maybe this number needs to be corrected
String methodName = e.getMethodName();

答案 2

下面是更现代(在 Java 9+ 中可用)且性能更好的代码。

private static String getCallerMethodName()
{
   return StackWalker.
      getInstance().
      walk(stream -> stream.skip(1).findFirst().get()).
      getMethodName();
}

根据需要更改为更大的数字,以便在堆栈上更高。skip(1)

这比因为它不遍历整个堆栈并分配所有堆栈帧的性能更好。它只在堆栈上行走两帧。Thread.currentThread().getStackTrace()

此方法可以调整为返回 StackWalker.StackFrame,其中包含有关该方法的大量信息。


推荐