Информация аннотации пропущена после компиляции с компилятором ECJ
Я обнаружил, что в байт-коде, скомпилированном из компилятора ECJ, отсутствует информация аннотации.
Исходный код декомпилирован из байт-кода, скомпилированного javac:
public class HelloWorldApp {
@GetAction("/hello")
public String sayHello() {
return "Hello World!";
}
}
Исходный код декомпилирован из байт-кода, скомпилированного ECJ:
public class HelloWorldApp {
public String sayHello() {
return "Hello World!";
}
}
Так ясно, аннотация @GetAction("/hello")
отсутствует в байт-коде, скомпилированном ECJ (при компиляции памяти).
Кто-нибудь сталкивался с этой проблемой раньше и получил какую-либо подсказку?
Обновление с дополнительной информацией
Посмотрите на следующий скриншот:
Так и есть в ASTNode.resolveAnnotations()
строка методов № 797:
А) состояние if ((method.tagBits & TagBits.AnnotationResolved) != 0) return annotations;
вернусь null
как аннотации даже
Б) исходная аннотация @GetAction("/hello")
представлен потому что
В) this.annotations
поле null
а также
D) условие if (method.tagBits & TagBits.AnnotationResolved) != 0
оценивает как истинное
Обновления 2
Похоже, что я снял экран слишком рано, поэтому после завершения процесса я обнаружил, что информация аннотаций сохраняется:
Однако я все еще не могу получить информацию аннотации из файла результатов. Нажмите здесь, чтобы загрузить сгенерированный файл байт-кода:
Обратите внимание, я использую ECJ 4.4.1:
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.4.1</version>
</dependency>
1 ответ
Задача решена! Просто добавьте следующие строки:
opt(map, OPTION_TargetPlatform, "1.6");
Проблема вызвана по умолчанию версия JDK 1.2 в ECJ, которая не поддерживает аннотации