• Home
  • Articles
    • 日志
    • 妍小言
    • 舒小书
    • 浩然说
    • 生活日记
  • All Tags

AbstractProcessor

19 Feb 2017

Reading time ~1 minute

新建过注解的同学肯定知道java.lang.annotation.RetentionPolicy#SOURCE,而AbstractProcessor就是配合源码期保留的注解来进行一些列工作的。

编写一个源码期注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface CheckFile {
}

实现自己的AbstractProcessor类

  • 继承抽象类AbstractProcessor
  • 指定AbstractProcessor所支持的注解类型
  • 实现抽象方法process
    • 可以使用javax.annotation.processing.ProcessingEnvironment,为父类的属性,访问权限为子类可见。
@SupportedAnnotationTypes({"org.eddy.CheckFile"})
public class AbstractProcessorImpl extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        Messager messager = processingEnv.getMessager();
        annotations.stream().forEach(an -> {
            roundEnv.getElementsAnnotatedWith(an).stream().forEach(el -> {
                messager.printMessage(Diagnostic.Kind.NOTE, "Element:" + el);
            });

        });
        return true;
    }

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }
}

修改pom文件

  • 指定编译期不执行任何AbstractProcessor,否则会出现问题
  • 主要代码-proc:none
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${your.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <!-- 禁止自己执行任何AbstractProcessor -->
                    <compilerArgument>-proc:none</compilerArgument>
                </configuration>
            </plugin>
        </plugins>
    </build>

增加SPI配置

  • 增加SPI实现,接口为javax.annotation.processing.Processor,实现类为org.eddy.AbstractProcessorImpl


javaannotation