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)