2012-06-08 64 views

回答

4

Stack introspection會給你方法的調用者或者最好的方法的一些細節,對於確切的方法簽名你將不得不使用反射。

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 

官方文件說:

返回表示該線程堆棧轉儲 堆棧跟蹤元件的陣列。如果此線程尚未啓動或終止,此方法將返回一個零長度數組。如果返回的數組長度爲非零長度 ,則數組的第一個元素表示堆棧的頂部 ,這是 序列中最新的方法調用。數組的最後一個元素表示 堆棧的底部,這是序列中最近最少的方法調用。

這樣從StackTrace你可以得到方法名稱,文件名,linenumber。

有關完整的方法簽名,你將不得不使用反射

+0

是反射是在尋找簽名確實是有用的,但我的要求是,我必須找到調用堆棧內省獲得方法的簽名,我沒有源代碼,我怎麼會知道一些重載哪種方法(比如方法)被調用使用調用堆棧和反射而不使用源代碼我確實有字節代碼? –

+0

我不認爲你可以,afaik只有方法名稱和(如果可用調試-g)行號出現在堆棧跟蹤中。如果它的一次性解決方案嘗試反編譯類和檢查行號 – JIV

2

您可以使用Java ReflectionStackTraceElement

StackTraceElement[] elements = new Throwable().getStackTrace(); 

    String calleeMethod = elements[0].getMethodName(); 
    String callerMethodName = elements[1].getMethodName(); 
    String callerClassName = elements[1].getClassName(); 

    System.out.println("CallerClassName=" + callerClassName + " , Caller method name: " + callerMethodName); 
    System.out.println("Callee method name: " + calleeMethod); 
+2

我認爲你的文章是沒有任何幫助我的問題 –