【发布时间】:2013-09-05 04:12:52
【问题描述】:
我一直在尝试使用 ASM 框架在我感兴趣的位置注入字节码,到目前为止我一直很成功。目前我正在尝试注入基本上创建一个类的新实例/对象的代码,在阅读了一点之后我发现这可以使用 INVOKESPECIAL 来实现(我希望我的理解是正确的 INVOKESPECIAL "INVOKESPECIAL for private methods and constructors")。
下面是我用来创建实例的代码sn-p
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 的使用/理解是否正确,如果正确,那么我在哪里做错了?
谢谢
【问题讨论】:
标签: bytecode java-bytecode-asm bytecode-manipulation