新建过注解的同学肯定知道
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