Как использовать 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 должна в любом случае оптимизировать подобные вещи, если значение действительно является константой. Вы профилировали, чтобы определить, что это на самом деле проблема?

Другие вопросы по тегам