Java中,ASM:如何从ASM InsnNode获取操作码的名称和TagValue?(Java,

2019-10-21 05:02发布

我工作的一些类文件的分析和我的工作使用ASM读班。 在javap的操作码和标记名和tagValue印刷直列,但在每AbstractInsnNode,我看到只为int字段(而不是tagValue)

for(AbstractInsnNode abstractInsnNode : instructionList)
{
   System.out.println("\tOpcode: " + + abstractInsnNode.getOpcode()  +
        " type: " + abstractInsnNode.getType());
}  

我如何获得与ASM,比如指令:

5: invokeinterface #6,  2 // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z

而在装载字符串和常量等的情况下,我需要访问这些值也是如此。 这通常来自tagValue的javap的。 我不只是需要打印这些,我还需要值编程方式访问。

我需要访问的基本操作信息,如以下字段:

 jvmOperations": [{
        "byteOffset": 0,
        "constantPoolIndex": null,
        "opCode": 42,
        "opCodeName": "aload_0",
        "type": null,
        "tagName": null,
        "tagValue": null
    }, {
        "byteOffset": 1,
        "constantPoolIndex": null,
        "opCode": 180,
        "opCodeName": "getfield",
        "type": null,
        "tagName": "Field",
        "tagValue": "val$foo:Lcom/example/graph/demo/Foo;"
    }, {
        "byteOffset": 4,
        "constantPoolIndex": null,
        "opCode": 182,
        "opCodeName": "invokevirtual",
        "type": null,
        "tagName": "Method",
        "tagValue": "com/example/graph/demo/Foo.doSomething:()Ljava/lang/Integer;"
    }, {
        "byteOffset": 7,
        "constantPoolIndex": null,
        "opCode": 176,
        "opCodeName": "areturn",
        "type": null,
        "tagName": null,
        "tagValue": null
    }]

Answer 1:

我会检查的源ASMifier和Textifier类如何打印出来的东西..



文章来源: Java, ASM: How to Get Opcode Name and TagValue from ASM InsnNode?