Подтвердить что ты не робот

Создание пользовательского AbstractProcessor и интеграция с Eclipse

Я пытаюсь создать новую аннотацию, с которой я буду выполнять проводку во время выполнения, но по ряду причин я бы хотел проверить во время компиляции, что моя проводка будет успешной с некоторыми рудиментарными проверками.

Предположим, что создаю новую аннотацию:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation{
}

Теперь я хочу выполнить некоторую проверку во время компиляции, например, проверить поле, которое CustomAnnotation аннотирует, определенного типа: ParticularType. Я работаю на Java 6, поэтому создал AbstractProcessor:

@SupportedAnnotationTypes("com.example.CustomAnnotation")
public class CompileTimeAnnotationProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, 
                           RoundEnvironment roundEnv) {
        Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(CustomAnnotation.class);
        for(Element e : elements){
            if(!e.getClass().equals(ParticularType.class)){
                processingEnv.getMessager().printMessage(Kind.ERROR,
                     "@CustomAnnotation annotated fields must be of type ParticularType");
            }
        }
        return true;
    }

}

Затем, основываясь на некоторых инструкциях, которые я нашел, я создал папку META-INF/services и создал файл javax.annotation.processing.Processor с содержимым:

 com.example.CompileTimeAnnotationProcessor

Затем я экспортировал проект как банку.

В другом проекте я построил простой тестовый класс:

public class TestClass {
    @CustomAnnotation
    private String bar; // not `ParticularType`
}

Я сконфигурировал свойства проекта Eclipse следующим образом:

  • Установить компилятор Java → Обработка аннотаций: "Включить обработку аннотаций" и "Включить обработку в редакторе"
  • Установить компилятор Java → Обработка аннотаций → Factory Путь к включению моего экспортированного банку и проверить его в расширенном состоянии, который отображается в моем полнофункциональном классе.

Я нажал кнопку "применить" и подсказки Eclipse, чтобы перестроить проект, я ударил все в порядке - но ошибка не возникает, несмотря на наличие обработчика аннотаций.

Где я ошибся?


Я использовал это, используя javac как

javac -classpath "..\bin;path\to\tools.jar" -processorpath ..\bin -processor com.example.CompileTimeAnnotationProcessor com\test\TestClass.java

с выходом

@CustomAnnotation аннотированные поля должны быть типа ParticularType

4b9b3361

Ответ 1

Чтобы ошибки отображались в редакторе, Element, вызывающий ошибку, должен быть помечен в функции printMessage. В приведенном выше примере это означает, что проверка времени компиляции должна использовать:

processingEnv.getMessager().printMessage(Kind.ERROR,
    "@CustomAnnotation annotated fields must be of type ParticularType",
    e); // note we explicitly pass the element "e" as the location of the error