编写程序时难免要打印一些日志信息,有时想要在输出的日志信息中加上方法名,这时调用
Thread.currentThread( ).getStackTrace( )[index].getMethodName( )
就可以轻松的解决这个问题。
Thred.currentThread( )
- 该方法返回值类型为 Thread,返回的是一个指向「当前正在执行的线程对象」的引用。
getStackTrace( )
- 该方法返回值类型为 StackTraceElement[ ] ,如果此线程尚未启动,或者已启动但尚未由系统运行,或者已经终止,此方法将返回一个零长度的数组。
StackTraceElement [ ]
通过调用相应的 StackTraceElement 对象的 getMethodName( ) 方法就能得到对应的方法名。此处需要指出的是所返回 StackTraceElement [ ] 数组的长度取决于线程的堆栈情况,而 StackTraceElement [0] ~ StackTraceElement [length-1] 反映的是方法嵌套调用的情况。
请看以下代码:
public class GetMethodNameDemo {
public static void main(String[] args) {
three();
}
private static void three() {
two();
}
private static void two() {
one();
}
private static void one() {
zero();
}
private static void zero() {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (int i = 0; i < stackTraceElements.length; i++) {
System.out.println("invoke stackTraceElement[" + i + "].getMethodName() return : "
+ stackTraceElements[i].getMethodName());
}
}
}
代码运行结果如下:
invoke stackTraceElement[0].getMethodName() return : getStackTrace
invoke stackTraceElement[1].getMethodName() return : zero
invoke stackTraceElement[2].getMethodName() return : one
invoke stackTraceElement[3].getMethodName() return : two
invoke stackTraceElement[4].getMethodName() return : three
invoke stackTraceElement[5].getMethodName() return : main
- stackTraceElement[0].getMethodName() 返回的始终是 getStackTrack
- stackTraceElement[1].getMethodName() 返回的始终是此行代码所在的方法名
- stackTraceElement[2].getMethodName() 返回的始终是调用此行代码所在方法的方法
以此类推,stackTraceElement[length-1].getMethodName() 返回的便是嵌套在最外层的方法。
总结
到此,我们就可以根据自己的需求写一个简单的工具类用以获取方法名。
例如:
public class Util {
public static void getCurrentMethodName() {
System.out.println(Thread.currentThread().getStackTrace()[2].getMethodName());
}
}
这样就可以通过调用 Util.getCurrentMethodName() 获取
Util.getCurrentMethodName();
这一行代码所在方法的方法名了。