2010-05-31 55 views
3

現在我有如何反射打印方法體?

private static void getMethods(Class<? extends Object> clazz) { 
    Method[] declaredMethods = clazz.getDeclaredMethods(); 
    for (Method aMethod : declaredMethods) { 
     aMethod.setAccessible(true); 

     // Print the declaration 
     System.out.print(Modifier.toString(aMethod.getModifiers()) + " " 
      + aMethod.getReturnType().getSimpleName() + " " + aMethod.getName()); 

     // Get Parameter Types 
     getParameters(aMethod); 

     //Empty Body 
     System.out.println("{}\n"); 
    } 
    } 

哪些反思打印最多的信息,但創建一個空的機構。如何添加Java的反射本質以打印方法體?

回答

5

如何添加Java的反射本質來打印方法體?

我相當困難,恐怕。

首先,原始源代碼很可能對正在運行的程序不可用。通常,開發人員不在二進制JAR中包含源代碼。 (即使他們這樣做,也不保證他們將成爲「真正」來源。)

通常可以通過將類的FQN轉換爲字節碼文件並使用類來獲取該類的字節碼類加載器將文件作爲資源流加載。但不能保證你以這種方式獲得的字節碼將與加載的字節碼相同。 (一些亂七八糟的類加載器與周圍的字節碼出於各種原因。)

假設你可以得到真正的字節碼,最後一步將是要麼顯示這些原料,或拆解或反編譯他們的東西更具可讀性。您應該可以使用javap進行反彙編,但反編譯需要使用第三方產品。當然,反編譯後的代碼與原始代碼看起來有很大不同,如果字節代碼被混淆了,他們的源代碼將幾乎不可讀。

4

Java在運行時沒有這些信息。你可以打印的唯一東西就是字節碼。

+0

....它甚至沒有保證你將能夠抓住他們。 – 2016-04-17 00:27:51

1

做這種事情的唯一方法是編寫/使用反編譯器。這涉及直接讀取字節碼,這不是ReflectionAPI的標準功能。原始源文件中表示的源代碼已不存在,並且可能無法像字節碼那樣完全重現該源代碼。 (例如,泛型會丟失,並且使用增強型for循環將無法區分,我相信還有其他的)。

0

如果你要打印的代碼是你的,你可以運送的來源和使用的方法代碼這個答案提取所需的方法:

getTheCode() method