1.获取当前方法堆栈,我们一般用
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
想要获取当前方法,切记不够灵活,使用数组stes的固定index(网上不少是这样说的,请明辨之)。
让我们来看api怎么说的吧?
getStackTrace
public StackTraceElement[] getStackTrace()
- 返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。
如果有安全管理器,并且该线程不是当前线程,则通过 RuntimePermission("getStackTrace") 权限调用安全管理器的 checkPermission 方法,查看是否可以获取堆栈跟踪。
某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有该线程堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。
- 返回:
- StackTraceElement 数组,每个数组代表一个堆栈帧。
- 抛出:
SecurityException
- 如果安全管理器存在,并且其 checkPermission 方法不允许获取线程的堆栈跟踪。- 从以下版本开始:
- 1.5
- 另请参见:
SecurityManager.checkPermission(java.security.Permission)
,RuntimePermission
,Throwable.getStackTrace()
注意,红色标注的地方,栈顶是最新的方法调用,栈底是最旧的方法调用
2. 实例:
/*TestDumpThread .java*/ public class TestDumpThread { //Dump the current thread stack trace. public static void getCurrentStackTrace() { StackTraceElement[] stes = Thread.currentThread().getStackTrace(); for (StackTraceElement element : stes) { System.out.println(element); } } public static void main(String[] args) { getCurrentStackTrace(); } }
结果如下:
java.lang.Thread.getStackTrace(Thread.java:1479) TestDumpThread.getCurrentStackTrace(TestDumpThread.java:5) TestDumpThread.main(TestDumpThread.java:12)