Java规范:JSR 269(Java Specification Requests)插件化注解处理API(Pluggable Annotation Processing API)
JDK1.6 提供的特性,在 Javac编译期(SOURCE标识)利用注解,在字节码文件中生成get、set等方法。
Java编译器执行过程:
public abstract class AbstractProcessor implements Processor{
}
自定义类似lombok注解案例:
1.0 定义编译期的注解
package org.example.core;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
//@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.SOURCE)
public @interface GetterSetter {
}
2.0 利用JSR269 api(Pluggable Annotation Processing API )创建编译期的注解处理器
@AutoService(Processor.class) //简化了SPI的配置
@SupportedAnnotationTypes("org.example.core.GetterSetter")
public class GetterSetterProcessor extends AbstractProcessor {
//利用tools.jar的javac api处理AST(抽象语法树)
}
<!-- AST工具包 -->
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${tools.path}</systemPath>
<optional>true</optional>
</dependency>
3.0 将功能注册进jar包,就是配置SPI
@AutoService(Processor.class) //简化了SPI的配置
<!-- 自动生成SPI文件 -->
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>1.0-rc5</version>
</dependency>
4.0 打成jar包
5.0 使用的项目引入jar, 就可以使用@GetterSetter