创建自定义AbstractProcessor并与Eclipse集成
我正在尝试创建一个新的注释,我将在其中进行一些运行时布线,但是,由于多种原因,我想在编译时validation我的布线是否会成功进行一些基本检查。
假设我创建了一个新注释:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomAnnotation{ }
现在我想在编译时进行某种validation,比如检查CustomAnnotation
注释的字段是否为特定类型: ParticularType
。 我在Java 6中工作,所以我创建了一个AbstractProcessor
:
@SupportedAnnotationTypes("com.example.CustomAnnotation") public class CompileTimeAnnotationProcessor extends AbstractProcessor { @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { Set 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项目属性:
- 设置Java编译器 – >注释处理:“启用注释处理”和“在编辑器中启用处理”
- 设置Java编译器 – >注释处理 – >工厂路径以包含我导出的jar并在高级下检查我的完全限定类显示。
我点击了“apply”,Eclipse提示重建项目,我点击了 – 但是没有错误,尽管有注释处理器。
我哪里做错了?
我使用javac
作为
javac -classpath "..\bin;path\to\tools.jar" -processorpath ..\bin -processor com.example.CompileTimeAnnotationProcessor com\test\TestClass.java
与输出
@CustomAnnotation带注释的字段必须是ParticularType类型
要在编辑器中显示错误,需要在printMessage
函数中标记导致错误的Element
。 对于上面的示例,这意味着编译时检查应使用:
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