我正在使用 ASM 注入代码并且到目前为止很幸运,在压力测试期间,我观察到我看到一些性能下降,因为我编写的代码正在进行大量静态调用,为了优化它,我尝试缓存变量我使用。在原始代码中,这就是我所做的
visitor.visitLdcInsn(getMethodName());
visitor.visitLdcInsn(getDescriptor());
visitor.visitMethodInsn(Opcodes.INVOKESTATIC, MYTRACKER.HELPER_CLASS,
MYTrackingConstants.HELPER_GET_CLIENT_METHOD,MYTrackingConstants.HELPER_GET_CLIENT_METHOD_DESC);
.
.
上面的静态调用导致性能问题,因为它被调用的次数,为了优化它我缓存了对象并在同一个类中添加了一个getterm方法并尝试使用它,上面的代码现在被下面的代码替换了
visitor.visitLdcInsn(getRTTDescriptor());
但是当我跑步时,我得到了这个异常
[err] java.lang.IllegalArgumentException: value com.vish.MyTransformDescriptor@63f463f4
[err] at org.objectweb.asm.ClassWriter.a(Unknown Source)
[err] at [internal classes]
[err] at sun.instrument.TransformerManager.transform(TransformerManager.java:181)
[err] at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:377)
[err] at java.lang.ClassLoader.defineClassImpl(Native Method)
[err] at java.lang.ClassLoader.defineClass(ClassLoader.java:275)
在阅读了 visitLdcInsn 的 javadoc 之后,我意识到我们不能直接使用 Object 类型的任何东西(getDescriptor 返回 Object,其中 getMethodName 和 getDescriptor 返回字符串),除非它是 org.objectweb.asm.Type 任何人都可以帮助我或提供示例如何使用 Type 加载我的对象的示例?
下面是我的代码片段
public RTMethodAdapter{
Object rttd;
public RTMethodAdapter(MethodVisitor visitor, MethodInfo mInfo, String reqOpsType, String classname,Object rttd, AnalyzerAdapter aa)
{
.
.
.
this.rttd = rttd;
}
public Object getRTTDescriptor(){
return rttd;
}
public String getMethodName() {
return methodInfo.getMethodName();
}
public String getDescriptor() {
return methodInfo.getDescriptor();
}
}
谢谢
维斯瓦纳特B