注解处理器(Annotation Processor)的定义与作用

1. 注解处理器(Annotation Processor)的定义与作用

定义

注解处理器是 Java 编译器的一种工具(javax.annotation.processing.Processor接口的实现类),它在编译期扫描和处理源代码中的注解(Annotation),并根据注解逻辑生成新的 Java 代码、资源文件或执行其他编译期操作。

作用

  • 代码生成:根据注解自动生成重复或模板化代码(如 Lombok 通过@Data生成 getter/setter,MyBatis 通过@Mapper生成代理类),减少手动编码。
  • 编译期校验:对注解标记的代码进行合法性检查(如 Lombok 验证@NonNull参数非空,Dagger 检查依赖注入是否完整),提前暴露错误。
  • 元数据处理:提取注解携带的元数据,用于生成配置文件、文档或其他编译产物。

2. 在 pom.xml 中配置注解处理器并定义执行顺序

Maven 中通过maven-compiler-plugin配置注解处理器,可指定处理器类路径及执行顺序。

配置示例(以 Lombok 为例):

<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 引用)。

3. 注解处理器的执行时机

注解处理器在 **Java 编译期的 “注解处理阶段”** 执行,具体时机如下:
  1. 编译器解析源代码,收集所有注解信息。
  2. 调用注解处理器的process()方法,传入注解相关的语法树(AST)。
  3. 处理器处理注解,生成新的 Java 代码(如.java文件)。
  4. 新生成的代码会被重新加入编译流程,重复上述步骤(支持增量处理),直到没有新代码生成。
  5. 所有处理器执行完毕后,编译器进入字节码生成阶段,编译所有源代码(包括手动编写和自动生成的)。
关键特点:处理器仅在编译期运行,不影响运行时性能;生成的代码与手动编写的代码同等参与编译。

总结

  • 注解处理器是编译期工具,核心作用是代码生成和编译期校验。
  • Maven 中通过maven-compiler-pluginannotationProcessorPaths-processor参数配置处理器及执行顺序。
  • 执行时机为编译期的注解处理阶段,支持增量处理生成的代码。
posted @ 2025-10-25 15:44  liftsail  阅读(14)  评论(0)    收藏  举报