简体   繁体   English

创建自定义AbstractProcessor并与Eclipse集成

[英]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项目属性:

  • Set Java Compiler -> Annotation Processing: "Enable annotation processing" and "Enable processing in editor" 设置Java编译器 - >注释处理:“启用注释处理”和“在编辑器中启用处理”
  • Set Java Compiler -> Annotation Processing -> Factory Path to include my exported jar and checked under advanced that my fully qualified class shows up. 设置Java编译器 - >注释处理 - >工厂路径以包含我导出的jar并在高级下检查我的完全限定类显示。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM