Как использовать visitLdcInsn для загрузки объекта
Я использую 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);
.
.
Приведенный выше статический вызов вызывает проблемы с производительностью, так как он называется числом раз, чтобы оптимизировать его, я кешировал объект и добавил метод gettermethod в тот же класс и попытался его использовать, приведенный выше код теперь заменен на один ниже
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)
После прочтения javadoc для visitLdcInsn я понял, что мы не можем просто напрямую использовать что-либо типа 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();
}
}
Спасибо
VishwanathB
1 ответ
Ldc обозначает постоянную нагрузку. Вы можете использовать его только для констант, которые известны при (пере) написании класса.
Кроме того, он может использоваться только для определенных типов констант: целых, длинных, плавающих, двойных, строк, классов, дескрипторов методов и типов методов. И постоянные строки ограничены до 64 КБ.
Наконец, это, вероятно, не будет иметь значения, так как JVM должна в любом случае оптимизировать подобные вещи, если значение действительно является константой. Вы профилировали, чтобы определить, что это на самом деле проблема?