Я пытаюсь создать новую аннотацию, с которой я сделаю некоторые соединение во время выполнения, но по ряду причин я хотел бы проверить во время компиляции, что мой монтаж будет успешным с помощью некоторых элементарных проверок.
Предположим, я создаю новую аннотацию:
@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
Затем я экспортировал проект как jar.
В другом проекте я создал простой тестовый класс:
public class TestClass {
@CustomAnnotation
private String bar; // not `ParticularType`
}
Я настроил Свойства проекта Eclipse следующие:
Я нажал «Применить», и Eclipse предложит перестроить проект, я нажал «ОК», но ошибки не возникает, несмотря на наличие процессора аннотаций.
Куда я пошел неправильно?
Я запустил это, используя javac
как
javac -classpath "..\bin;path\to\tools.jar" -processorpath ..\bin -processor com.example.CompileTimeAnnotationProcessor com\test\TestClass.java
с выходными
аннотированные поля @CustomAnnotation должны иметь type ParticularType