【问题标题】:Create new object using ASM使用 ASM 创建新对象
【发布时间】: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


    【解决方案1】:

    我不记得 newLocal() 的确切作用,但我知道该方法不会将 NEW 指令插入字节码。它只是在一些 ASM 内部局部变量处理机制中保留空间。

    尝试使用类似的东西

    visitor.visitTypeInst(Opcodes.NEW, "com/vish/RequestTrackerEvent");
    

    祝你好运

    【讨论】:

    • 感谢 ruediste,我是 ASM 和字节码操作的新手,我会尝试你的建议。
    • 我读了 Eugene Kuleshov 写的一篇文章,上面写着“注意,这种转换不能用于拦截类构造(Java 语言中的新功能)。在字节码对象构造中,由两个独立的在事件流中可能相距甚远的指令。第一个是新操作码,它创建指定类型的未初始化对象实例。在使用该实例之前,必须使用 INVOKESPECIAL 操作码调用该实例的 方法。 "我将您的建议与 INVOKESPECIAL 一起使用,之后我能够使用参数创建新实例
    • 非常感谢您的帮助
    【解决方案2】:

    类似“如何使用 ASM 生成{一些 Java 代码}”has been answered in ASM FAQ 之类的问题:

    如果你想知道如何生成同步块,试试 catch 块、finally 语句或任何其他 Java 构造,编写 要在临时类中生成的 Java 代码,使用 javac,然后使用 ASMifier 获取 ASM 代码 生成此类(参见“10. How do I get the bytecode of an existing class?”)。

    您可以更进一步,如this article 中所述,比较转换前后 ASMifier 的输出。

    【讨论】:

    • 谢谢尤金,这些链接真的很有帮助..ClassVisitor 和 MethodVisitor OPCODES 的 javadocs 没有描述每种方法的作用或指示不同的 OPCODES 的作用......是否有链接或文档在哪里我可以获得有关 ASM API 的更多详细信息??
    • 那将是另一个有单独答案的问题... :)
    • 感谢 Euguene 将提出另一个问题:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多