通過StackTraceElement獲取方法呼叫者的具體資訊
阿新 • • 發佈:2019-01-07
本文簡要介紹了StackTrace(堆疊軌跡)以及StackTraceElement的一些用法
一、什麼是StackTrace
StackTrace(堆疊軌跡)可以認為是一系列方法呼叫過程的集合。
異常處理中常用的printStackTrace()即為列印異常呼叫的堆疊資訊。
二、StackTraceElement介紹
StackTraceElement表示StackTrace(堆疊軌跡)中的一個元素,屬性包括方法呼叫者的類名、方法名、檔名以及呼叫的行數。
public final class StackTraceElement implements java.io.Serializable { // Normally initialized by VM (public constructor added in 1.5) private String declaringClass; private String methodName; private String fileName; private int lineNumber;
StackTraceElement被定義為final,可見其作為一個java的基礎類不允許被繼承。
獲取StackTraceElement的方法有兩種,均返回StackTraceElement陣列
1、Thread.currentThread().getStackTrace()
2、new Throwable().getStackTrace()
StackTraceElement陣列包含了StackTrace(堆疊軌跡)的內容,通過遍歷它可以得到方法間的呼叫過程,
即可以得到當前方法以及其呼叫者的方法名、呼叫行數等資訊
執行main方法,輸出資訊如下public class TestClass { public static void main(String[] args) { new TestClass().methodA(); } private void methodA(){ System.out.println("------進入methodA----------"); methodB(); } private void methodB(){ System.out.println("------進入methodB----------"); StackTraceElement elements[] = Thread.currentThread().getStackTrace(); for (int i = 0; i < elements.length; i++) { StackTraceElement stackTraceElement=elements[i]; String className=stackTraceElement.getClassName(); String methodName=stackTraceElement.getMethodName(); String fileName=stackTraceElement.getFileName(); int lineNumber=stackTraceElement.getLineNumber(); System.out.println("StackTraceElement陣列下標 i="+i+",fileName=" +fileName+",className="+className+",methodName="+methodName+",lineNumber="+lineNumber); } } }
可以看到在方法B中使用getStackTrace,
得到StackTraceElement陣列中下標為2的element表示方法B的呼叫者方法A的詳細資訊