2015-07-27 4 views
1

Я пытаюсь написать несколько байт-кода манипуляции в моем веб-приложение теперь, когда я пытаюсь внедрить свой код в мои методы, которые он всегда выдает мне ошибкуjavassist.CannotCompileException: [исходная ошибка]) отсутствует, что это такое?

javassist.CannotCompileException: [Ошибка источника]) отсутствует

Я не знаю, почему и что это такое ... Я немного искал Google, и некоторые люди говорят, что это ошибка с javassist версии 1.0, но я думаю, что это действительно нереально.

private void changeMethod(CtMethod method) throws NotFoundException, 
CannotCompileException { 
    if (method.hasAnnotation(Loggable.class)) { 

    method.getName(); 


     method.insertBefore("long startTime = 0;" + 
       "long startTime = System.currentTimeMillis();" + 
       " Thread thread1 = new Thread(new Runnable(){\n" + 
       "   @Override\n" + 
       "   public void run() {\n" + 
       "    threadLogger.info(\"Testlog\");\n" + 
       "\n" + 
       "    try {\n" + 
       "     threadLogger.logCall(Webservice.this.getClass().getMethod(startThread0), \"Thread\");\n" + 
       "     \n" + 
       "    } catch (Exception e) {\n" + 
       "     e.printStackTrace();\n" + 
       "    }\n" + 
       "\n" + 
       "   }\n" + 
       "  });\n" + 
       "  thread1.start();"); 

    } 
} 
enter code here 

ответ

0

Относится к ошибкам компиляции в исходном коде внутри строки. Первой проблемой, которую я могу обнаружить, является то, что у вас есть

long startTime = 0; 
long startTime = System.currentTimeMillis(); 

Вы определяете переменную дважды, и это не будет скомпилировано.

В целом самый простой способ написать код Javassist - это скопировать это из вашего класса среды IDE. Это поможет вам выявить большинство проблем и может сэкономить некоторое время на отладку кода в Strings. Конечно, это не идеально, потому что большую часть времени код не будет компилироваться в среде IDE, потому что он ссылается на что-то, что будет работать только в точке ввода кода, но он найдет проблемы, такие как двойная переменная и т. Д.

+0

hmm Это не проблема: s без манипуляции с байт-кодом работает код – alovaros

+0

Вы можете распечатать строку, вставить в IDE и посмотреть, компилируется ли она. Это не должно быть так, как вы дважды определяете одну и ту же переменную. – toomasr

+0

Jeah Я знаю, что вы имеете в виду, я исправил код, чтобы дважды определить одну и ту же переменную, и когда я запускаю этот код в своей среде IDE, он отлично работает – alovaros

1

Как вы можете прочитать в документации Javassist, section 4.7 Limitations (полужирный это моя):

Внутренние классы или анонимные классы не поддерживаются. Обратите внимание, что это является ограничением только для компилятора. Он не может скомпилировать исходный код , включая объявление анонимного класса. Javassist может читать и изменить файл класса внутреннего/анонимного класса.

Вы пытаетесь ввести анонимный класс Runnable, поэтому он не будет работать. Ваш лучший способ решить эту проблему - извлечь код класса Runnable в новый класс, который доступен в пути к классам при инъекции и времени выполнения, и использовать этот класс в коде для инъекций.

+0

. Сперва: D Это займет некоторое время, пока я не закодировал это, потому что я плохой ха-ха, но я уверен, что это сработает: D – alovaros

0

Теперь я написал метод и просто набрал метод с манипуляцией байт-кодом ... было самым простым разрешением.

Смежные вопросы