2013-01-14 36 views
0

Here是有關INVOKESPECIAL字節碼指令的參考。如果我從包含INVOKESPECIAL指令的ASM框架獲得AbstractInsnNode,我的節點是否會包含指令的方法說明? 例如,像這樣的代碼:字節碼和ASM

String ins = insn.toString; 

如果insn中有一個INVOKESPECIAL指令,我的插件就會有像 「invokespecial爪哇/郎/ StringBuffer的/()V」 的字符串?

我想要做的是從INVOKESPECIAL指令中獲取方法說明並將其存儲在一個字符串中,以便我的程序可以讀取它。

回答

0

你想在運行時讀取類嗎?試試這個

import org.objectweb.asm.ClassReader; 
    import org.objectweb.asm.util.ASMifierClassVisitor; 


    ClassReader cr = new ClassReader(b); 
    cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0); 
0

如果非要從包含INVOKESPECIAL指令ASM框架的AbstractInsnNode,將我的節點包括指令的方法規範?

AFAIK,是的。它應該是MethodInsnNode的一個實例,並且desc字段應該是一個方法描述符字符串。

如果insn有一個INVOKESPECIAL指令,我的ins會有一個像「invokespecial java/lang/StringBuffer /()V」的字符串?

實際上,有三個組件。方法描述符字符串,方法名稱和擁有(在本例中爲實際)方法的類的內部名稱。

+0

所以如果我將一個methodinsnnode變量轉換爲字符串,我將能夠使用像.contains(「lang」)這樣的方法在描述符中查找單詞「lang」? – user1912475

+0

聽起來像一個壞主意。您應該可以將對象轉換爲'MethodInsnNode',然後通過聲明的字段訪問信息。它有點不清楚你實際上是在什麼信息之後,但它*看起來像*你想要聲明方法的類型的名稱而不是方法的簽名。 (不幸的是,你的問題有些方面沒有意義。) –

+0

讓我試着解釋一下:我只是想在字符串中存儲描述符(其中是由invokespecial指令調用的超類的名稱),所以我的程序可以最終讀取這個字符串,並知道是否調用該方法來處理異常 – user1912475