Я пытаюсь создать новую аннотацию, с которой я буду выполнять проводку во время выполнения, но по ряду причин я бы хотел проверить во время компиляции, что моя проводка будет успешной с некоторыми рудиментарными проверками.
Предположим, что создаю новую аннотацию:
@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