Информация аннотации пропущена после компиляции с компилятором 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, которая не поддерживает аннотации

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