我正在尝试遵循 ASM 用户手册 (http://download.forge.objectweb.org/asm/asm4-guide.pdf) 第 112 页上的委托示例。到目前为止,我有一些看起来像这样的东西:
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()
将指令添加到方法指令列表的末尾似乎运行良好,但这不是我想要的。我希望新的静态调用成为方法体中的第一件事。