Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ASM树API插入到InsnList中给出StackOverflower错误?_Java_Compiler Construction_Jvm_Bytecode_Java Bytecode Asm - Fatal编程技术网

Java ASM树API插入到InsnList中给出StackOverflower错误?

Java ASM树API插入到InsnList中给出StackOverflower错误?,java,compiler-construction,jvm,bytecode,java-bytecode-asm,Java,Compiler Construction,Jvm,Bytecode,Java Bytecode Asm,我试图遵循ASM用户手册第112页上的委派示例(http://download.forge.objectweb.org/asm/asm4-guide.pdf). 到目前为止,我有一些东西看起来像这样: class MyMethodAdapter extends MethodVisitor { MethodVisitor next; public MyMethodAdapter(int access, String name, String desc,

我试图遵循ASM用户手册第112页上的委派示例(http://download.forge.objectweb.org/asm/asm4-guide.pdf). 到目前为止,我有一些东西看起来像这样:

class MyMethodAdapter extends MethodVisitor {
    MethodVisitor next;
    public MyMethodAdapter(int access, String name, String desc,
                           String signature, String[] exceptions, MethodVisitor mv) {
        super(
            Opcodes.ASM4,
            new MethodNode(access, name, desc, signature, exceptions)
        );
        next = mv;
    }

    @Override public void visitEnd() {
        MethodNode mn = (MethodNode) mv;

        mn.instructions.insert(new MethodInsnNode(INVOKESTATIC, "runtime/Recorder", "checkBytecodes", "()V"));


        mn.accept(next);
    }
}
不幸的是,当我运行它时,它失败了:

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 844

Exception: java.lang.StackOverflowError thrown from the UncaughtExceptionHandler in thread "main"
只有当
mn.instructions.insert(
行已经存在,所以我的转换管道的其余部分大概可以正常工作。这里有什么我遗漏的吗?我实际上是把我的转换放在手册中标出的
//把你的转换代码放在这里
区域,产生的错误是完全无法理解的


add()
将指令添加到方法的指令列表末尾似乎运行良好,但这不是我想要的。我希望新的静态调用成为方法体中的第一件事。

如果没有堆栈跟踪,很难说这是否与ASM API有关

您仍然可以使用以下命令在指令列表的开头插入呼叫:

mn.instructions.insertBefore(mn.instructions.getFirst(), 
    new MethodInsnNode(INVOKESTATIC, "runtime/Recorder", "checkBytecodes", "()V"));