私は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の使用法/理解が正しいかどうかを理解するのを手伝ってくれる人はいますか?
ありがとう