我一直试图使用ASM框架在我感兴趣的位置注入字节码,直到now.Currently我才成功地尝试注入代码,它基本上创建了一个类的新实例/对象,在阅读了一些之后,我发现可以使用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个参数(长、长、字符串、字符串),但是每当我这样做时,我就会得到一个异常,如下所示
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的使用/理解是否正确吗?如果是正确的话,那么我在哪里做错了?
谢谢
发布于 2013-09-05 19:16:14
类似于“如何用ASM生成{一些Java代码}”这样的问题,已在ASM常见问题中得到解答
如果您想知道如何生成同步块、try catch块、finally语句或任何其他Java构造,则编写要在临时类中生成的Java代码,用javac编译它,然后使用ASMifier获取生成该类的10.如何获取现有类的字节码?代码(请参见"10.如何获取现有类的字节码?")。
您还可以更进一步,通过比较转换前后的ASMifier输出(如这篇文章中所描述的)。
发布于 2013-09-05 13:09:48
我不完全记得newLocal()做了什么,但我知道这个方法不会在字节码中插入新的指令。它在一些ASM内部局部变量处理机制中保留了空间。
尝试使用类似的方法
visitor.visitTypeInst(Opcodes.NEW, "com/vish/RequestTrackerEvent");祝好运
https://stackoverflow.com/questions/18627618
复制相似问题