Java自定义注解处理器通过继承AbstractProcessor并在init()中获取Messager,于process()中调用printMessage输出编译期警告;需在META-INF/services/下注册、用@SupportedAnnotationTypes声明支持注解,并通过RoundEnvironment获取被注解元素进行条件判断。

Java 中自定义注解处理器(Processor)可以在编译期通过 Messager 输出警告日志,无需运行时干预,也不依赖第三方日志框架。
注册并继承 AbstractProcessor
创建一个类继承 javax.annotation.processing.AbstractProcessor,重写 init() 和 process() 方法。在 init() 中获取 Messager 实例,它是编译器提供的消息输出工具。
-
Messager是编译器注入的,只能在init()后使用 - 必须在
resources/META-INF/services/javax.annotation.processing.Processor文件中声明全限定类名,否则编译器不会加载该处理器 - 推荐添加
@SupportedAnnotationTypes注解,显式声明支持哪些注解,避免无谓触发
用 Messager.printMessage 输出警告
在 process() 方法中,调用 messager.printMessage(Diagnostic.Kind.WARNING, "警告内容", element) 即可输出编译期警告。其中:
-
Diagnostic.Kind.WARNING表示警告级别(非错误,不中断编译) - 第二个参数是警告文本,支持普通字符串或格式化(如
String.format拼接) - 第三个参数是关联的
Element(如被标注的类、方法),能让警告准确定位到源码位置
例如:对带有 @DeprecatedApi 注解的方法,输出 "该 API 已废弃,请改用 XxxService.doSomething()",IDE 和命令行编译都会显示带行号的黄色警告。
立即学习“Java免费学习笔记(深入)”;
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
获取被注解元素并做条件判断
通过 RoundEnvironment 的 getElementsAnnotatedWith() 获取所有匹配注解的元素,再逐个检查是否满足警告条件:
- 可用
element.getKind()判断是类、方法还是字段 - 用
element.getSimpleName()或element.asType()提取名称或类型信息 - 结合
element.getAnnotationMirrors()可读取注解属性值(如@WarnOn("v2.0")中的版本号)
这样就能实现“仅当方法返回类型为 void 且标注了 @Dangerous 时才发出警告”这类精细控制。
编译时启用并验证效果
确保构建工具能识别注解处理器:
- Maven 项目需将处理器模块作为
compile依赖,并配置maven-compiler-plugin的annotationProcessorPaths - Gradle 使用
annotationProcessor或compileOnly+processor配置 - 命令行编译需用
javac -processor YourProcessor ...显式指定
成功后,修改源码触发重新编译,警告会出现在编译日志中,且 IDE(如 IntelliJ)会在对应代码行下方标黄提示,点击可跳转。

















