1

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()メソッドの命令リストの最後まで命令を実行するとうまくいくように見えますが、それは私が望んでいることではありません。新しい静的呼び出しがメソッド本体の最初のものになるようにします。

4

1 に答える 1

0

スタック トレースがなければ、これが ASM API に関連しているかどうかを判断するのは困難です。

次を使用して、命令リストの先頭に呼び出しを挿入できます。

mn.instructions.insertBefore(mn.instructions.getFirst(), 
    new MethodInsnNode(INVOKESTATIC, "runtime/Recorder", "checkBytecodes", "()V"));
于 2012-10-31T16:12:50.343 に答える