私は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);
.
.
上記の静的呼び出しは、何度も呼び出されるため、パフォーマンスの問題を引き起こしています。最適化するために、オブジェクトをキャッシュし、同じクラスにゲッターメソッドを追加して使用しようとしました。上記のコードは、以下のコードに置き換えられました。
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 を読んだ後、org.objectweb.asm.Type でない限り、Object 型 (getDescriptor は Object を返しますが、getMethodName および getDescriptor は文字列を返します) のものを直接使用することはできないことに気付きました。 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