让我们考虑一下,我有一个类型为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;
}
请帮助我。
答案 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 end
和LocalVariableNode
指令所指示的LabelNode指令之间也一样最简单的方法是使用@Holger在对answer by @Antimony的评论中建议的BasicAnalyer。因此,您将为VarInsnNode获取关联的Frame对象,并执行frame.getStack(((VarInsnNode) abstractNode).var)
来获取ALOAD指令的变量的desc。
答案 1 :(得分:0)
Java字节码是隐式键入的,因此没有直接方法可以找到字节码中的值类型。您必须进行数据流分析,以找到在何处创建值并以这种方式获取类型。如果该类具有堆栈映射,则只需将其追溯到先前的堆栈映射,但仍需要大量工作。