编写java自定义编译期注解处理器需继承abstractprocessor,正确实现getsupportedannotationtypes()和process()方法,通过meta-inf/services/javax.annotation.processing.processor注册,并使用filer生成文件,确保编译时启用。

要编写 Java 自定义编译期注解处理器,核心是继承 AbstractProcessor 并正确注册、声明处理逻辑。它不是运行时反射,而是在 javac 编译阶段介入,生成代码或校验逻辑,关键在于“被识别”和“被调用”两个环节。
声明并实现 Processor 类
继承 AbstractProcessor,重写 getSupportedAnnotationTypes() 和 process() 方法。注意:init() 可用于获取常用工具(如 Elements、Filer、Messager),建议缓存复用。
-
getSupportedAnnotationTypes()返回你希望处理的注解全限定名,推荐用Set.of(YourAnnotation.class.getCanonicalName());若支持所有注解可返回Set.of("*")(不推荐) -
process()是主入口:参数annotations是本轮编译中匹配到的注解元素集合,roundEnv提供当前轮次的上下文(如getElementsAnnotatedWith()) - 必须返回
true表示已处理该注解(后续轮次不再交由本 processor 处理),返回false表示未处理完,可能在后续 round 再次调用
通过 META-INF/services 注册处理器
编译器不会自动发现你的 Processor,必须显式声明。在 src/main/resources/META-INF/services/ 下创建文件 javax.annotation.processing.Processor(注意路径和文件名完全一致),内容为你的处理器类全限定名,例如:
多个处理器换行写即可。Maven 构建时需确保该资源被正确打包进 jar 的对应位置。
正确使用 Filer 生成源码或 class 文件
不能直接用 FileWriter 写文件——必须通过 ProcessingEnvironment.getFiler() 创建文件,否则会被编译器忽略或报错。
- 生成 Java 源文件:调用
filer.createSourceFile(className, originatingElements...),返回JavaFileObject,再用openWriter()写入符合 Java 语法的字符串(建议配合JavaPoet等库构造) - 生成资源文件(如配置):用
filer.createResource(...) - 禁止生成已有类名的源文件(会冲突),也避免在
process()中抛出未捕获异常,否则编译失败且无明确提示
编译时启用并验证处理器
仅写好 Processor 不够,还需让 javac 加载它:
- Maven 项目:把 processor 打成独立 jar,并在使用方模块的
<dependencies></dependencies>中引入;同时确保该 jar 包含META-INF/services/...文件 - 命令行编译:用
javac -processorpath your-processor.jar -processor com.example.MyAnnotationProcessor ... - IDE 支持:IntelliJ 默认启用 annotation processing(Settings → Build → Compiler → Annotation Processors),Eclipse 需手动开启;若没生效,检查是否启用了 “Obtain processors from project classpath”
- 调试技巧:在
process()中用messager.printMessage(Diagnostic.Kind.NOTE, "processing...")输出日志,编译时可见
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











