我正在尝试将 ASM 用于我的项目并遇到性能问题,我试图使用静态方法获取所需的对象,并且它被调用了 1000 次
visitor.visitMethodInsn(Opcodes.INVOKESTATIC, TrackingConstants.TO_HELPER_CLASS, "getRTTDObject",TrackingConstants.TO_HELPER_GET_CLIENT_METHOD_DESC);
visitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, TrackingConstants.CLIENT_INTERFACE_CLASS, "getPattern",TrackingConstants.CLIENT_INTERFACE_CLASS_GETPATTERN_METHOD_DESC);
第一次调用导致了我的开销(我得到所需的对象并传递到下一行以对对象执行“getPattern”。在调查期间,我意识到我试图通过静态方法检索的对象可以从启动自己所以如果我能够将该Java对象推入堆栈并避免静态调用我不会遇到任何性能问题
我尝试了几种没有运气的方法最后尝试创建对象的新字段但得到一个IllegalArgumentException 类似于这篇文章
Creating a new field with asm 4在通过链接后我意识到我们需要编写代码来创建对象并且不能直接使用现有对象。
那么有没有办法我可以将现有的 Java 对象加载到堆栈上(我猜它已经在堆栈上,有没有办法可以使用它)并执行所需的操作而不是使用静态调用来获取它?有没有办法可以实现它?