注解处理器是 Java 编译器的一种工具(javax.annotation.processing.Processor接口的实现类),它在编译期扫描和处理源代码中的注解(Annotation),并根据注解逻辑生成新的 Java 代码、资源文件或执行其他编译期操作。
- 代码生成:根据注解自动生成重复或模板化代码(如 Lombok 通过
@Data生成 getter/setter,MyBatis 通过@Mapper生成代理类),减少手动编码。
- 编译期校验:对注解标记的代码进行合法性检查(如 Lombok 验证
@NonNull参数非空,Dagger 检查依赖注入是否完整),提前暴露错误。
- 元数据处理:提取注解携带的元数据,用于生成配置文件、文档或其他编译产物。
Maven 中通过maven-compiler-plugin配置注解处理器,可指定处理器类路径及执行顺序。
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><!-- 配置注解处理器路径 --><annotationProcessorPaths><!-- 第一个处理器:Lombok --><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></path><!-- 第二个处理器:其他处理器(如MapStruct) --><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.5.3.Final</version></path></annotationProcessorPaths><!-- 强制指定处理器执行顺序(按声明顺序执行) --><compilerArgs><arg>-processor</arg><arg>lombok.launch.AnnotationProcessorHider$AnnotationProcessor,org.mapstruct.ap.MappingProcessor</arg></compilerArgs></configuration></plugin></plugins>
</build>
annotationProcessorPaths中声明的处理器默认按顺序执行,但部分编译器可能不严格遵循,建议通过-processor参数显式指定全类名顺序(用逗号分隔),确保先执行的处理器生成的代码能被后续处理器使用(如 Lombok 生成的 getter 需被 MapStruct 引用)。
注解处理器在 **Java 编译期的 “注解处理阶段”** 执行,具体时机如下:
- 编译器解析源代码,收集所有注解信息。
- 调用注解处理器的
process()方法,传入注解相关的语法树(AST)。
- 处理器处理注解,生成新的 Java 代码(如
.java文件)。
- 新生成的代码会被重新加入编译流程,重复上述步骤(支持增量处理),直到没有新代码生成。
- 所有处理器执行完毕后,编译器进入字节码生成阶段,编译所有源代码(包括手动编写和自动生成的)。
关键特点:处理器仅在编译期运行,不影响运行时性能;生成的代码与手动编写的代码同等参与编译。
- 注解处理器是编译期工具,核心作用是代码生成和编译期校验。
- Maven 中通过
maven-compiler-plugin的annotationProcessorPaths和-processor参数配置处理器及执行顺序。
- 执行时机为编译期的注解处理阶段,支持增量处理生成的代码。