Java注解处理器核心三步:声明支持的注解、重写process()方法、在META-INF/services/javax.annotation.processing.Processor中注册;关键在于正确获取元素、生成代码且不破坏编译流程。

写一个 Java 注解处理器(AbstractProcessor)核心是三步:声明支持的注解、重写 process() 方法处理逻辑、在 META-INF/services/javax.annotation.processing.Processor 中注册。关键不是“能运行”,而是“能正确获取元素、生成代码、不破坏编译流程”。
1. 继承 AbstractProcessor 并声明支持的注解
你的处理器必须继承 AbstractProcessor,并用 @SupportedAnnotationTypes 明确指定它响应哪些注解(支持通配符 *,但不推荐)。同时建议加上 @SupportedSourceVersion 声明兼容的 Java 版本。
示例:
<font size="2"><pre class="brush:php;toolbar:false;">@SupportedAnnotationTypes("com.example.MyAnnotation")<br>@SupportedSourceVersion(SourceVersion.RELEASE_17)<br>public class MyProcessor extends AbstractProcessor {<br> @Override<br> public boolean process(Set<? extends TypeElement> annotations,<br RoundEnvironment roundEnv) {<br> // 实际处理逻辑<br> return true;<br> }<br>}
2. 在 process() 中安全地遍历和处理被注解的元素
process() 会被编译器多次调用(多轮处理),每次传入本轮发现的注解及对应元素。务必用 roundEnv.getElementsAnnotatedWith(...) 获取元素,不要依赖字段缓存 —— 元素可能跨轮出现或未完全解析。
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
常见操作包括:
- 用
element.getEnclosedElements()获取类内部的字段/方法 - 用
element.asType().toString()获取类型字符串(注意:不能直接instanceof判断泛型类型) - 用
processingEnv.getElementUtils().getTypeElement("java.lang.String")安全获取已知类型 - 对
VariableElement(字段)、ExecutableElement(方法)做类型检查时,优先用Types.isAssignable()而非字符串匹配
3. 用 Filer 生成源码或资源文件(不能修改原类)
注解处理器**不能修改已有源文件**,只能通过 processingEnv.getFiler() 创建新文件。生成 Java 源码推荐用 Filer.createSourceFile(),配合 JavaFileObject.openWriter() 写入内容。
重要细节:
- 生成的类名必须与文件路径严格匹配(如生成
com.example.Foo,路径必须是com/example/Foo.java) - 避免在
process()中抛出未捕获异常,否则编译失败;应记录日志并返回false表示未完全处理 - 若需读取注解属性值,用
annotationMirror.getElementValues()+AnnotationValueVisitor安全提取,尤其注意数组、嵌套注解等复杂类型
4. 正确注册处理器(否则编译器根本不会加载)
在 src/main/resources/META-INF/services/ 下创建文件:javax.annotation.processing.Processor,内容只有一行:
<font size="2">com.example.MyProcessor</font>
如果是 Maven 项目,确保该路径在编译输出中(resources 目录需被 maven-resources-plugin 处理)。Gradle 用户注意:src/main/resources 默认参与打包,但需确认 annotationProcessor 依赖已正确定义(不是 compileOnly 或 implementation)。

















