2012-10-05 60 views
1

在Java中,一個可以編寫代碼,如下面的詢問堆棧:Java反射跟蹤

StackTraceElement[] stack = Thread.currentThread().getStackTrace(); 
for (StackTraceElement frame : stack) { 
    System.out.println(frame.getClassName() + "." + frame.getMethodName()); 
} 

是否有可能得到的堆棧,而不僅僅是獲得的反射圖類和方法的名稱,我反而得到類和方法實例?如果一個類中的兩個方法共享一個名稱(具有不同的參數),我可以在堆棧中區分它們嗎?

+2

對於第二個問題,我不這麼認爲。 – MadProgrammer

回答

2

Class位很容易。使用Class.forName(String)

StackTraceElement[] stack = Thread.currentThread().getStackTrace(); 
for (StackTraceElement frame : stack) { 
    String fqcn = frame.getClassName(); 
    Class<?> clazz = Class.forName(fqcn); 
} 

如果兩個方法在類股票的名稱(使用不同的參數),我能區分它們在堆棧上?

我不這麼認爲,因爲方法名稱按StackTraceElement#getMethodName()返回不包含參數號&類型的信息,這是你需要具有相同名字的方法來區分什麼。

+0

仍然在看第二部分。 MadProgrammer可能是對的。 –

+1

我想,至少可以用類似的技術來獲得一組候選*方法:調用getDeclaredMethods()並過濾名稱。 – Martin

+0

是的,這是完全正確的。請記住,在這裏不要太過分:堆棧跟蹤用於調試目的。 –

2

是否有可能獲得堆棧的反射圖,其中,而不是剛剛起步的類和方法的名稱,而不是我弄的類和方法的實例?

您可以通過在類字符串上調用Class.forName來獲得Class實例;看到馬特球的答案。 (嵌套/內/匿名類可能會比較麻煩一些,...)

如果兩個類股的方法的名稱(使用不同的參數),我能區分它們在堆棧上?

只有當您有源代碼時,您的應用程序纔會使用調試信息進行編譯,並且能夠解析它以找出哪些行號對應於哪種方法重載。最後一步將是很多工作要實現,並且計算成本很高。 (這也是一個理論上的問題,可以在一行中編寫帶有多個方法重載的Java源代碼,如果你這樣做了,就不可能將方法與stacktrace。)