lombok 之原理

参考:https://blog.csdn.net/jeasonlzy/article/details/74273851

以下没有讲解原理,而是自定义模拟 lombok :

自定义注解:

/**
 * @author Alay
 * @date 2020-03-09 22:55
 */
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface MyData {
 
}

自定义注解处理器:

/**
 * @author Alay
 * @date 2020-03-09 22:56
 */
@SupportedAnnotationTypes(value = {"com.behelpful.xxx.xxx.mylombok.annotation.MyData"})
@SupportedSourceVersion(value = SourceVersion.RELEASE_8)
public class MyDataProcessor extends AbstractProcessor {
   @Override
   public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
      // 获取加入 MyData 注解的字段或者类
      Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(MyData.class);
      for (Element element : elements) {
         // 进行响应的逻辑处理
      }
      return true;
   }
   
}

对应注解的处理器需要继承AbstractProcessor类,需要复写以下4个方法:

1、init方法,会被注解处理工具调用

2、process方法,这相当于每个处理器的主函数main(),你在这里写你的扫描、评估和处理注解的代码,以及生成Java文件。

3、getSupportedSourceVersion方法,指定使用的Java版本,通常这里返回SourceVersion.latestSupported(),默认返回当前JDK支持的最后一个发布版本

4、getSupportedAnnotationTypes方法,这里必须指定,这个注解处理器是注册给哪个注解的。注意,它的返回值是一个字符串的集合,包含本处理器想要处理的注解类型的合法全称,即注解器所支持的注解类型集合,如果没有这样的类型,则返回一个空集合

 

将自定义注解处理器添加到 jsr 269 规范中

src\main\resources\META-INF\services\javax.annotation.processing.Processor

文件

javax.annotation.processing.Processor

内容:处理器类路径

com.behelpful.xxx.xxx.mylombok.processor.MyDataProcessor

Maven 中加入编译插件:

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.8.0</version>
         <configuration>
            <compilerArgument>
               -proc:none
            </compilerArgument>
            <source>1.8</source>
            <target>1.8</target>
         </configuration>
      </plugin>
   </plugins>
</build>

...

posted @ 2021-11-30 13:15  Vermeer  阅读(64)  评论(0)    收藏  举报