本文运用的环境版别:

Java 1.8

Project Lombok >= 1.18.24

Lombok是什么?

Project Lombok(Lombok)是一个根据注解的Java库,允许你削减模板代码。

Lombok供给了各种注解,旨在替代那些众所周知的模板化、重复性或繁琐的Java代码。

例如,经过运用Lombok,你只需增加一些注解,就可以防止编写没有参数的构造函数、toString()、equals()和hashCode()办法等等。

Lombok的作业原理探求

从1.6开始,java推出了JSR 269 Pluggable Annotation Processing API 标准

Lombok继承并完成了这些API,对注解进行处理

在javac运行的时分,假如java文件中包括了Lombok注解,Lombok就会在编译class文件时做出对应的操作

在编译时,javac编译源文件时会调用Lombok的Api,对编译文件进行修正,并生成新的class文件

具体完成状况如下:

  • 在编译过程中,javac对.java源码分析生成AST抽象语法树(对于ASTjava语法树的内容,后续我会更新一篇文章来专门做讲解)
  • 假如.java文件中包括Lombok注解,根据JSR 269 API,会调用lombok完成的办法
  • 例如:假如咱们java文件中包括@Getter注解,Lombok注解处理器就会找到@Getter注解地点java类对应的AST抽象语法树,然后修正该语法树(AST),增加getterr办法定义的相应树节点

如下图所示,增加@Getter注解后,编译的class文件包括了参数的get办法,但是在源java文件中是不包括这些办法的。

如何为项目引进Lombok?

Gradle

compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'

Maven

<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
      <scope>provided</scope>
</dependency>

maven编译器插件增加lombok依赖:

<build>
      <plugins>      
            <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.5.1</version>
                  <configuration>
                        <source>11</source>
                        <target>11</target>
                        <annotationProcessorPaths>
                              <path>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                    <version>1.18.24</version>
                              </path>                              
                        </annotationProcessorPaths>
                  </configuration>
            </plugin>
            <!-- ... -->  
      </plugins>
</build>

Lombok 常用注解大全

代码示例

@Log
@Log4j
@Log4j2
@Slf4j
@XSlf4j
@JBossLog
@CommonsLog
@Flogger
public class LombokDemo {
    public static void main(String[] args) {
        Demo01 demo01 = new Demo01();
        demo01.setId("369");
        demo01.setNum(1);
        demo01.setFlag(true);
        log.info(demo01.toString());
    }
   //参数相关
   @Getter
    @Setter
    @EqualsAndHashCode(of = {"id","name"})
    @ToString(of = {"id","flag"})
    //构造函数
    @NoArgsConstructor
    @RequiredArgsConstructor
    @AllArgsConstructor
   @Data
//   @Value
   @Builder
//   @Singular("xxx")
    private static class Demo01 {
        private String id;
        private Integer num;
        private Boolean flag;
    }
    @SneakyThrows
    private void throwMethod(){
        int i = 1/0 ;
    }
    @Synchronized
    private void sych(){
        int i = 1/0 ;
    }
    @SneakyThrows
    private void cleanup(){
        @Cleanup FileInputStream inputStream = new FileInputStream("xxx");
    }
    private void var(){
        var zero = 1L;
        var s = "str";
        var list = new ArrayList<>();
        var map = new HashMap<>();
    }
}

关于是否要运用Lombok的谈论

长处:

  • 开发便捷,不需要手动生产一些getset办法

  • 修正字段方便,不需要维护字段衍生的一些办法

缺陷:

  • 病毒式传达,一旦项目中有人运用了lombok,那么其他人势必也要引进此插件
  • 代码可读性差,经过注解的办法生产class代码,这就导致咱们无法直观的看到一些办法完成的细节
  • 代码可调试性下降,因为lombok是编译时插件,所以在运行的时分,咱们在编译器里就很难定位到具体的办法,只能去class文件去查看具体错误方位
  • 踩坑,欲负王冠,必承其重。在实际项目作业中,多多少少总会遇到运用lombok踩坑的问题,这种时分兜兜转转一大圈才发现问题出在lombok上,那酸爽,别提多得劲了~

总结

本文中,经过对lombok原理探求,以及一些常用注解的总结,来学习了一下lombok,假如你对本篇文章感兴趣,请在谈论区留言,一同学习


本文正在参与「金石方案 . 分割6万现金大奖」