ASM:如何查找ALOAD中包含的对象类型

时间:2019-03-03 11:48:43

标签: bytecode java-bytecode-asm bytecode-manipulation jvm-bytecode

让我们考虑一下,我有一个类型为ALOAD的AbstractInsnNode。 该ALOAD包含一个Exception对象,同时引用了类文件的字节码。我想知道使用ASM Java的ALOAD的描述。 使用LocalVariableNode,(我所做的是)我遍历methodNode并找到了localvariables名称和desc。但是不知道要与相应的ALOAD关联。

for ( Object a: methodnode.localVariables) {
        LocalVariableNode lvn = (LocalVariableNode)a;
        System.out.println(lvn.desc);
    }


if ((abstractNode.getOpcode() == Constant.ALOAD)) {
           //do Something to check the desc of the ALOAD
            return;
  }

请帮助我。

2 个答案:

答案 0 :(得分:1)

ALOAD指令包含一个数字参数,该参数告诉它加载哪个局部变量。一旦有了它,我们然后在methodnode.localVariables(您已经在屏幕上打印)中查找正确的字符。

因此,一种解决方法是首先找出代表ALOAD指令的类。您可以像“ aload extends abstractinsnnode site:asm.ow2.io这样的Google搜索来找到要使用的* InsnNode。 ALOAD的答案是VarInsnNode。它肯定包含一个字段int var,其中包含它加载的本地变量号。它必须与int index列表中的LocalVariableNode字段匹配。但是,相同的索引可能会在同一方法内出于不同目的重用,因此您还需要验证您的指令是否在LabelNode start中的LabelNode endLocalVariableNode指令所指示的LabelNode指令之间也一样最简单的方法是使用@Holger在对answer by @Antimony的评论中建议的BasicAnalyer。因此,您将为VarInsnNode获取关联的Frame对象,并执行frame.getStack(((VarInsnNode) abstractNode).var)来获取ALOAD指令的变量的desc。

答案 1 :(得分:0)

Java字节码是隐式键入的,因此没有直接方法可以找到字节码中的值类型。您必须进行数据流分析,以找到在何处创建值并以这种方式获取类型。如果该类具有堆栈映射,则只需将其追溯到先前的堆栈映射,但仍需要大量工作。