首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ASM创建新对象

使用ASM创建新对象
EN

Stack Overflow用户
提问于 2013-09-05 04:12:52
回答 2查看 2.7K关注 0票数 4

我一直试图使用ASM框架在我感兴趣的位置注入字节码,直到now.Currently我才成功地尝试注入代码,它基本上创建了一个类的新实例/对象,在阅读了一些之后,我发现可以使用INVOKESPECIAL实现这一点(我希望我对INVOKESPECIAL "INVOKESPECIAL对于私有方法和构造器的理解是正确的“)。

下面是我用来创建实例的代码片段

代码语言:javascript
复制
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个参数(长、长、字符串、字符串),但是每当我这样做时,我就会得到一个异常,如下所示

代码语言:javascript
复制
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的使用/理解是否正确吗?如果是正确的话,那么我在哪里做错了?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-05 19:16:14

类似于“如何用ASM生成{一些Java代码}”这样的问题,已在ASM常见问题中得到解答

如果您想知道如何生成同步块、try catch块、finally语句或任何其他Java构造,则编写要在临时类中生成的Java代码,用javac编译它,然后使用ASMifier获取生成该类的10.如何获取现有类的字节码?代码(请参见"10.如何获取现有类的字节码?")。

您还可以更进一步,通过比较转换前后的ASMifier输出(如这篇文章中所描述的)。

票数 1
EN

Stack Overflow用户

发布于 2013-09-05 13:09:48

我不完全记得newLocal()做了什么,但我知道这个方法不会在字节码中插入新的指令。它在一些ASM内部局部变量处理机制中保留了空间。

尝试使用类似的方法

代码语言:javascript
复制
visitor.visitTypeInst(Opcodes.NEW, "com/vish/RequestTrackerEvent");

祝好运

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18627618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档