[英]Creating a custom AbstractProcessor and integrating with Eclipse
I'm trying to create a new annotation with which I'll do some runtime wiring, but, for a number of reasons, I'd like to verify at compile time that my wiring will be successful with some rudimentary checks. 我正在尝试创建一个新的注释,我将在其中进行一些运行时布线,但是,由于多种原因,我想在编译时验证我的布线是否会成功进行一些基本检查。
Suppose I create a new annotation: 假设我创建了一个新注释:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation{
}
Now I want to do some kind of validation at compile time, like check the field that CustomAnnotation
annotates is of a particular type: ParticularType
. 现在我想在编译时进行某种验证,比如检查CustomAnnotation
注释的字段是否为特定类型: ParticularType
。 I'm working in Java 6, so I created an AbstractProcessor
: 我在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;
}
}
Then, based on some instructions I found, I created a folder META-INF/services
and created a file javax.annotation.processing.Processor
with contents: 然后,根据我发现的一些指令,我创建了一个文件夹META-INF/services
并创建了一个文件javax.annotation.processing.Processor
,内容如下:
com.example.CompileTimeAnnotationProcessor
Then, I exported the project as a jar. 然后,我将项目导出为jar。
In another project, I built a simple test class: 在另一个项目中,我构建了一个简单的测试类:
public class TestClass {
@CustomAnnotation
private String bar; // not `ParticularType`
}
I configured the Eclipse project properties as follows: 我按如下方式配置了Eclipse项目属性:
I clicked "apply" and Eclipse prompts to rebuild the project, I hit okay -- but no error is thrown, despite having the annotation processor. 我点击了“apply”,Eclipse提示重建项目,我点击了 - 但是没有错误,尽管有注释处理器。
Where did I go wrong? 我哪里做错了?
I ran this using javac
as 我使用javac
作为
javac -classpath "..\bin;path\to\tools.jar" -processorpath ..\bin -processor com.example.CompileTimeAnnotationProcessor com\test\TestClass.java
with output 与输出
@CustomAnnotation annotated fields must be of type ParticularType @CustomAnnotation带注释的字段必须是ParticularType类型
To have errors show up in the editor, the Element
causing the error needs to be tagged in the printMessage
function. 要在编辑器中显示错误,需要在printMessage
函数中标记导致错误的Element
。 For the example above, this means that the compile time check should use: 对于上面的示例,这意味着编译时检查应使用:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.