Thread.currentThread().getStackTrace()的作用
一、简介
getStackTrace()返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。getStackTrace()[0]表示的事getStackTrace方法。意思就是当我们利用这个我们可以获取到我们方法调用的情况。例如在methodA ->methhodB->methhodC,getStackTrace()可以获取我们整个的调用链利用数组保存。
二、示例
我们可以验证一下看看获取的具体的数据是什么。我们先创建一个小的demo,
目前我们是methodA -> methodB->getStackTrace
import java.lang.reflect.Method;
public class StackTraceDemo {
public static void main(String[] args) {
methodA();
}
public static void methodA() {
methodB();
}
public static void methodB() {
StackTraceElement[] stackTrace = getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
System.out.println(stackTraceElement);
}
}
public static void methodC() {
}
public static void methodD() {
}
public static StackTraceElement[] getStackTrace() {
return Thread.currentThread().getStackTrace();
}
}
我们可以看下结果,结果
java.lang.Thread.getStackTrace(Thread.java:1559)
com.zeng.spring.StackTraceDemo.getStackTrace(StackTraceDemo.java:33)
com.zeng.spring.StackTraceDemo.methodB(StackTraceDemo.java:18)
com.zeng.spring.StackTraceDemo.methodA(StackTraceDemo.java:13)
com.zeng.spring.StackTraceDemo.main(StackTraceDemo.java:9)
可以看到其实这就是整个方法的调用链。方法的调用涉及出栈入栈,返回的数组的顺序其实也就是方法出栈的顺序。
三、可以有什么用呢?
getStackTrace返回的StackTraceElement可以获取方法名称、方法所在类等信息。stackTrace[2]获取的是com.zeng.spring.StackTraceDemo.methodB(StackTraceDemo.java:18)
这个StackTraceElement:
public static void methodB() {
StackTraceElement[] stackTrace = getStackTrace();
StackTraceElement stackTraceElement = stackTrace[2];
System.out.println("类className"+stackTraceElement.getClassName());
System.out.println("方法名称MethodName"+stackTraceElement.getMethodName());
System.out.println("文件名file"+stackTraceElement.getFileName());
System.out.println("方法所在的行号"+stackTraceElement.getLineNumber());
}
可以看看下方的结果,我们最终获取到了具体的方法信息了。
类className : com.zeng.spring.StackTraceDemo
方法名称MethodName : methodB
文件名file : StackTraceDemo.java
方法所在的行号 : 18