【问题标题】:bytecode and ASM字节码和 ASM
【发布时间】:2013-01-14 02:49:23
【问题描述】:

Here 是关于 INVOKESPECIAL 字节码指令的参考。如果我有一个来自 ASM 框架的 AbstractInsnNode 包含 INVOKESPECIAL 指令,我的节点会包含指令的方法规范吗? 例如,使用这样的代码:

String ins = insn.toString;

如果 insn 有 INVOKESPECIAL 指令,我的 ins 会有一个类似“invokespecial java/lang/StringBuffer/()V”的字符串?

我想做的是从 INVOKESPECIAL 指令中获取方法规范并将其存储在字符串中,以便我的程序可以读取它。

【问题讨论】:

    标签: java bytecode descriptor


    【解决方案1】:

    您想在运行时阅读课程吗?试试这个

        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);
    

    【讨论】:

      【解决方案2】:

      如果我有一个来自 ASM 框架的 AbstractInsnNode 包含 INVOKESPECIAL 指令,我的节点会包含该指令的方法规范吗?

      AFAIK,是的。它应该是MethodInsnNode 的一个实例,desc 字段应该是一个方法描述符字符串。

      如果 insn 有 INVOKESPECIAL 指令,我的 ins 会有一个类似“invokespecial java/lang/StringBuffer/()V”的字符串?

      实际上,有三个组件。方法描述符字符串、方法名称和拥有(在本例中为实际)方法的类的内部名称。

      【讨论】:

      • 所以如果我将 methodinsnnode 变量转换为字符串,我将能够使用 .contains("lang") 之类的方法在描述符中查找单词“lang”?
      • 听起来是个坏主意。您应该能够将对象转换为MethodInsnNode,然后通过声明的字段访问信息。有点不清楚您实际需要的是什么信息,但看起来您想要的是声明方法的类型的名称,而不是方法的签名。 (不幸的是,您的问题的某些方面毫无意义。)
      • 让我尝试解释一下:我只想将描述符(invokespecial 指令调用的超类的名称在哪里)存储在一个字符串中,以便我的程序最终可以读取该字符串并知道方法被调用来处理异常
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多