4

私はASMフレームワークを使用して興味のある場所にバイトコードを挿入しようとしてきましたが、今まで成功しています。現在、基本的にクラスの新しいインスタンス/オブジェクトを作成するコードを挿入しようとしていますが、少し読んだ後、これが見つかりましたINVOKESPECIAL を使用して実現できます (INVOKESPECIAL の「プライベート メソッドとコンストラクターの INVOKESPECIAL」についての私の理解が正しかったことを願っています)。

以下は、インスタンスの作成に使用したコード スニペットです。

visitor.visitLdcInsn(System.currentTimeMillis());
visitor.visitLdcInsn(System.currentTimeMillis());
visitor.visitLdcInsn(_type);
visitor.visitVarInsn(ALOAD, metanamevarindex);

eventObject = newLocal(Type.getType("com/vish/RequestTrackerEvent"));

visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "com/vish/RequestTrackerEvent", "<init>",
                            "(JJLjava/lang/String;Ljava/lang/String;)V");

visitor.visitVarInsn(ASTORE, eventObject);

クラスのコンストラクターは 4 つの引数 (long、long、String、String) を取りますが、これを行うたびに以下のような例外が発生します。

java.lang.VerifyError: JVMVRFY036 stack underflow;
    at java.lang.J9VMInternals.verifyImpl(Native Method)
    at java.lang.J9VMInternals.verify(J9VMInternals.java:72)
    at java.lang.J9VMInternals.verify(J9VMInternals.java:70)
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:134)

私のINVOKESPECIALの使用法/理解が正しいかどうかを理解するのを手伝ってくれる人はいますか?

ありがとう

4

2 に答える 2

1

Question like "how do I generate {some Java code} with ASM" has been answered in ASM FAQ:

If you want to know how to generate a synchronized block, a try catch block, a finally statement, or any other Java construct, write the Java code you want to generate in a temporary class, compile it with javac, and then use the ASMifier to get the ASM code that will generate this class (see "10. How do I get the bytecode of an existing class?").

You can go even further, by comparing output of ASMifier before and after transformation as described in this article.

于 2013-09-05T19:16:14.607 に答える