2012-10-31 14 views
1

我正在尝试遵循ASM用户手册(http://download.forge.objectweb.org/asm/asm4-guide.pdf)第112页上的委派示例。到目前为止,我有东西,看起来像这样:ASM Tree API插入InsnList给StackOverflowError?

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(线是目前发生的,所以想必其余我转化管道工程。有什么我在这里失踪?我将字面意义上的变化放在手册中标出的// put your transformation code here区域,所产生的错误完全无法理解。

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

回答

0

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

您可以在指令列表的开头使用仍然插入您的来电:

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