2013-01-14 40 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