Java 注解處理器(Annotation Processor)是 Java 編譯時(shí)(Compile-time)處理注解的工具,屬于 JSR 269 規(guī)范的一部分。它允許開發(fā)者在代碼編譯階段掃描、解析和處理注解,生成額外的代碼或資源文件(如 .java、.class 或配置文件)。以下是核心要點(diǎn):
1、核心用途
- 代碼生成
- 編譯時(shí)檢查
- 元數(shù)據(jù)處理
2、關(guān)鍵組件 - 定義注解
- 繼承javax.annotation.processing.AbstractProcessor 類,并重寫process 方法
- 新建文件META-INF/services/javax.annotation.processing.Processor,在文件中聲明處理器類
3、實(shí)現(xiàn)步驟 - 自定義注解
@Target({ElementType.TYPE}) //作用于類和接口
@Retention(RetentionPolicy.RUNTIME)//運(yùn)行時(shí)
public @interface MySelfAnnotation {
String value() default "";
}
- 注解處理器實(shí)現(xiàn)
@SupportedAnnotationTypes("com.example.MySelfAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_17)
public class MyAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
for (TypeElement annotation : annotations) {
// 處理被 @MySelfAnnotation 標(biāo)記的元素
Set<? extends Element> elements = env.getElementsAnnotatedWith(annotation);
for (Element element : elements) {
//使用JavacTrees、TreeMaker 來處理代碼生成檢查等
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Found: " + element);
}
}
return true; // 已處理,無需其他處理器介入
}
}
- 注冊注解處理器
在 resources/META-INF/services/javax.annotation.processing.Processor 文件中寫入:
com.example.MyAnnotationProcessor
4、引用
將自定義的注解處理器編譯成jar包之后,就可以供其他模塊使用了。
其他模塊應(yīng)用之后,編譯是可能報(bào)出錯(cuò)誤
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project Mono: Compilation failure
[ERROR] 服務(wù)配置文件不正確, 或構(gòu)造處理程序?qū)ο骿avax.annotation.processing.Processor: com.topjoy.jdiff.jsr269.MyAnnotationProcessor Unable to get public no-arg constructor時(shí)拋出異常錯(cuò)誤
如果碰到這個(gè)錯(cuò)誤,就需要給maven打包的時(shí)候添加jvm參數(shù),具體詳見一下文章:http://www.itdecent.cn/p/10ac8835704f