gpt4 book ai didi

bytecode - 使用ASM创建新对象

转载 作者:行者123 更新时间:2023-12-02 14:42:06 26 4
gpt4 key购买 nike

我一直在尝试使用 ASM 框架在我感兴趣的位置注入(inject)字节码,到目前为止我已经成功了。目前我正在尝试注入(inject)代码,该代码基本上创建了一个类的新实例/对象,在阅读了一些内容之后,我发现这可以使用 INVOKESPECIAL 来实现(我希望我的理解是正确的 INVOKESPECIAL“私有(private)方法和构造函数的 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 的使用/理解是否正确,如果正确,那么我在哪里做错了?

谢谢

最佳答案

我不记得 newLocal() 到底做了什么,但我知道该方法不会在字节码中插入 NEW 指令。它只是在一些ASM内部局部变量处理机制中保留空间。

尝试使用类似的东西

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

祝你好运

关于bytecode - 使用ASM创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18627618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com