admin 管理员组

文章数量: 887021

java中运行方法名,java

java - 获取当前正在执行的方法的名称

有没有办法在Java中获取当前正在执行的方法的名称?

20个解决方案

271 votes

从技术上讲,这将有效......

String name = new Object(){}.getClass().getEnclosingMethod().getName();

但是,在编译期间将创建一个新的匿名内部类(例如getEnclosingConstructor())。 因此,这将为部署此技巧的每个方法创建一个getEnclosingMethod()文件。 另外,在运行时期间在每次调用时创建否则未使用的对象实例。 所以这可能是一个可接受的调试技巧,但它确实带来了巨大的开销。

这个技巧的一个优点是getEnclosingConstructor()返回getEnclosingMethod(),可用于检索该方法的所有其他信息,包括注释和参数名称。 这使得可以区分具有相同名称的特定方法(方法过载)。

请注意,根据getEnclosingConstructor()的JavaDoc,这个技巧不应该抛出getEnclosingMethod(),因为内部类应该使用相同的类加载器加载。 因此,即使存在安全管理器,也无需检查访问条件。

对于构造函数,需要使用getEnclosingConstructor()。 在(命名)方法之外的块期间,getEnclosingMethod()返回null。

Devin answered 2019-01-02T05:53:16Z

156 votes

Thread.getStackTrace().getStackTrace()通常会包含您从中调用它的方法但存在缺陷(请参阅Javadoc):

在某些情况下,某些虚拟机可能会从堆栈跟踪中省略一个或多个堆栈帧。 在极端情况下,允许没有关于此线程的堆栈跟踪信息的虚拟机从此方法返回零长度数组。

Bombe answered 2019-01-02T05:52:18Z

130 votes

2009年1月:

一个完整的代码(用于@Bombe的警告):

/**

* Get the method name for a depth in call stack.

* Utility function

* @param depth depth in the call stack (0 means current method, 1 means call method, ...)

* @return method name

*/

public static String getMethodName(final int depth)

{

final StackTraceElement[] ste = Thread.currentThread().getStackTrace();

//System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName());

// return ste[ste.length - depth].getMethodName(); //Wrong, fails for depth = 0

return ste[ste.length - 1 - depth].getMethodName(); //Thank you Tom Tresansky

}

更多关于这个问题。

2011年12月更新:

蓝色评论:

我使用JRE 6并给出了错误的方法名称。

如果我写ste[2 + depth].getMethodName().,它可以工作

2是getMethodName(int depth),

2是getMethodName(int depth)和

2正在调用方法。

virgo47的答案(upvoted)实际上计算了要应用的正确索引以便取回方法名称。

VonC answered 2019-01-02T05:55:05Z

81 votes

我们使用此代码来缓解堆栈跟踪索引中的潜在可变性 - 现在只需调用methodName util:

public class MethodNameTest {

private static final int CLIENT_CODE_STACK_INDEX;

static {

// Finds out the index of "this code" in the returned stack trace - funny but it differs in JDK 1.5 and 1.6

int i = 0;

for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {

i++;

if (ste.getClassName().equals(MethodNameTest.class.getName())) {

break;

}

}

CLIENT_CODE_STACK_INDEX = i;

}

public static void main(String[] args) {

System.out.println("methodName() = " + methodName());

System.out.println("CLIENT_CODE_STACK_INDEX = " + CLIENT_CODE_STACK_INDEX);

}

public static String methodName() {

return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX].getMethodName();

}

}

似乎过度工程,但我们有一些JDK 1.5的固定数字,当我们转向JDK 1.6时,它有点惊讶。 现在它在Java 6/7中是相同的

本文标签: java中运行方法名 java