Я пытаюсь создать новую аннотацию, с помощью которой я сделаю некоторую разводку во время выполнения, но по ряду причин я хотел бы проверить во время компиляции, что моя разводка будет успешной с некоторыми элементарными проверками.
Предположим, я создаю новую аннотацию:
@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 Compiler -> Обработка аннотаций: «Включить обработку аннотаций» и «Включить обработку в редакторе»
- Установите Java Compiler -> Annotation Processing -> Factory Path, чтобы включить мой экспортированный jar и проверил в расширенном режиме, что мой полностью квалифицированный класс обнаруживается.
Я нажал «Применить», и Eclipse предлагает перестроить проект, я нажал «хорошо», но ошибки не выдается, несмотря на наличие процессора аннотаций.
Где я ошибся?
Я запустил это, используя javac
как
javac -classpath "..\bin;path\to\tools.jar" -processorpath ..\bin -processor com.example.CompileTimeAnnotationProcessor com\test\TestClass.java
с выводом
@ Пользовательские аннотированные поля должны иметь тип ParticularType