java - 访问 ASM Java 库中的局部变量

标签 java variables local

我试图在插入方法时调用局部变量。 到目前为止,我能够获取节点中的局部变量,但实际上无法访问任何内容。

这是我的插入内容(它非常草率,我已经这样做了一段时间,一段时间前设计不再是我的主要优先事项):

        final ClassReader reader = new ClassReader("revel/reflection/test/SomeClass");
    final ClassNode classNode = new ClassNode();
    reader.accept(classNode, 0);
    for(final MethodNode mn : (List<MethodNode>)classNode.methods) {
        if(mn.name.equalsIgnoreCase("testLocals")) {
            final InsnList list = new InsnList();

            for(final LocalVariableNode local : (List<LocalVariableNode>)mn.localVariables) {
                System.out.println("Local Variable: " + local.name + " : " + local.desc + " : " + local.signature + " : " + local.index);
                if(local.desc.contains("String")) {
                    mn.visitVarInsn(Opcodes.ALOAD, local.index);
                    final VarInsnNode node = new VarInsnNode(Opcodes.ALOAD, 1);

                    list.add(node);
                    System.out.println("added local var '" + local.name + "'");
                }
            }

            final MethodInsnNode insertion = new MethodInsnNode(Opcodes.INVOKESTATIC, "revel/reflection/test/Test", "printLocalString", "(Ljava/lang/String;)V");
            list.add(insertion);
            mn.instructions.insert(list);
        }
    }

    ClassWriter writer = new ClassWriter(0);
    classNode.accept(writer);

    loadClass(writer.toByteArray(), "revel.reflection.test.SomeClass");
    SomeClass.testLocals(true);

它试图进入的方法:

    public static void testLocals(boolean one) {
    String two = "hello local variables";
    one = true;
    int three = 64;
}

它产生:

Local Variable: one : Z : null : 0
Local Variable: two : Ljava/lang/String; : null : 1
added local var 'two'
Local Variable: three : I : null : 2
Exception in thread "main" java.lang.VerifyError: Bad local variable type
Exception Details:
  Location:
    revel/reflection/test/SomeClass.testLocals(Z)V @0: aload_1
  Reason:
    Type top (current frame, locals[1]) is not assignable to reference type
  Current Frame:
    bci: @0
    flags: { }
    locals: { integer }
    stack: { }
  Bytecode:
    0000000: 2bb8 0040 1242 4c04 3b10 403d b12b     

        at revel.reflection.test.Test.main(Test.java:66)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at                         sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

第 66 行是 SomeClass.testLocals(true); 任何人都可以阐明这种情况吗?

最佳答案

看起来您的问题出在 mn.instructions.insert(list); 行,它在方法 testLocals 的所有指令列表的开头插入新指令。换句话说,您甚至在声明或赋值之前就已经使用了变量 two。尝试使用 mn.instructions.add(list); 看看是否能解决问题。

祝你好运!

关于java - 访问 ASM Java 库中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21807016/

相关文章:

c - 这个双重声明在 C 中是什么意思?

java - 尝试在 java 中使用 protobuf 发送和接收消息,但出现错误 : Protocol message contained an invalid tag (zero)

java - StringEnumeration(一般枚举)

bash - 在 YAD 中使用变量

java - 为什么Java只在基本程序中加上

java - 最终参数被复制到隐藏变量中?

仅适用于本地开发人员的 PHP、postfix、sendmail、thunderbird

java - 防止写入默认属性值 JAXB

java - 为什么divide() 函数在Java BigInteger 中不起作用?

variables - Jekyll:在定义其他变量时使用变量