Java ASM可视局部变量不工作
我正在尝试使用ASM5.0 MethodVisitor来获取关于visitLocalVariable的局部变量的一些信息。然而,当我运行代码时,visitLocalVariable似乎从未运行过Java ASM可视局部变量不工作,java,local-variables,java-bytecode-asm,visitor,Java,Local Variables,Java Bytecode Asm,Visitor,我正在尝试使用ASM5.0 MethodVisitor来获取关于visitLocalVariable的局部变量的一些信息。然而,当我运行代码时,visitLocalVariable似乎从未运行过 public static class ModifierMethodWriter extends MethodVisitor{ private String methodName; public ModifierMethodWriter(int api, MethodVisitor m
public static class ModifierMethodWriter extends MethodVisitor{
private String methodName;
public ModifierMethodWriter(int api, MethodVisitor mv, String methodName) {
super(api, mv);
this.methodName=methodName;
}
// **some other visitor method, which works well, including "visitVarInsn"...**
public void visitLocalVariable(String name,
String desc,
String signature,
Label start,
Label end,
int index) {
super.visitLocalVariable(name, desc, signature, start, end, index);
System.out.println("LOCAL - " + name + " TYPE: " + desc + " " + signature + " INDEX: " + index);
// nothing get print in this method
}
}
这是从演示类ClassModifierDemo.java的以下链接中修改的示例访问局部变量要求代码具有关联的调试属性。否则,JVM就不知道局部变量的名称和作用域,甚至它们的形式类型也可能会改变。@Holger明白了!但是有没有办法用ASM来区分局部变量的范围呢?例如,一个方法调用中有两个循环(因此两个循环中的变量属于不同的范围)。我想知道哪个变量属于哪个循环。可能吗?在字节码级别,局部变量只是由索引寻址的堆栈帧中的一个插槽。该插槽可以在整个代码中表示相同的源代码级别变量,也可以在不同的代码位置表示不同的变量。您只能使用插槽中的存储来推断是否由于以前的值变得不可访问而启动了新范围。如果新值具有不兼容的类型,则从Java源代码的角度来看,它显然是一个新变量(如果字节码是通过编译Java源代码生成的),但如果新值具有兼容的类型,则无法确定。