1. 程式人生 > >通過StackTraceElement獲取方法呼叫者的具體資訊

通過StackTraceElement獲取方法呼叫者的具體資訊

本文簡要介紹了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(堆疊軌跡)的內容,通過遍歷它可以得到方法間的呼叫過程,

即可以得到當前方法以及其呼叫者的方法名、呼叫行數等資訊

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);
        }
    }
}
執行main方法,輸出資訊如下


可以看到在方法B中使用getStackTrace,

得到StackTraceElement陣列中下標為2的element表示方法B的呼叫者方法A的詳細資訊