Java规范:JSR 269(Java Specification Requests)插件化注解处理API(Pluggable Annotation Processing API)
    JDK1.6 提供的特性,在 Javac编译期(SOURCE标识)利用注解,在字节码文件中生成get、set等方法。

    Java编译器执行过程:
    lombok原理 - 图1

    1. public abstract class AbstractProcessor implements Processor{
    2. }

    自定义类似lombok注解案例:
    1.0 定义编译期的注解

    1. package org.example.core;
    2. import java.lang.annotation.ElementType;
    3. import java.lang.annotation.Retention;
    4. import java.lang.annotation.RetentionPolicy;
    5. import java.lang.annotation.Target;
    6. @Target(ElementType.TYPE)
    7. //@Retention(RetentionPolicy.CLASS)
    8. @Retention(RetentionPolicy.SOURCE)
    9. public @interface GetterSetter {
    10. }

    2.0 利用JSR269 api(Pluggable Annotation Processing API )创建编译期的注解处理器

    1. @AutoService(Processor.class) //简化了SPI的配置
    2. @SupportedAnnotationTypes("org.example.core.GetterSetter")
    3. public class GetterSetterProcessor extends AbstractProcessor {
    4. //利用tools.jar的javac api处理AST(抽象语法树)
    5. }
    1. <!-- AST工具包 -->
    2. <dependency>
    3. <groupId>com.sun</groupId>
    4. <artifactId>tools</artifactId>
    5. <version>1.8</version>
    6. <scope>system</scope>
    7. <systemPath>${tools.path}</systemPath>
    8. <optional>true</optional>
    9. </dependency>

    3.0 将功能注册进jar包,就是配置SPI
    @AutoService(Processor.class) //简化了SPI的配置

    1. <!-- 自动生成SPI文件 -->
    2. <dependency>
    3. <groupId>com.google.auto.service</groupId>
    4. <artifactId>auto-service</artifactId>
    5. <version>1.0-rc5</version>
    6. </dependency>

    4.0 打成jar包

    5.0 使用的项目引入jar, 就可以使用@GetterSetter