likes
comments
collection
share

[日积月累]Lombok注解学习笔记

作者站长头像
站长
· 阅读数 25

本文使用的环境版本:

Java 1.8

Project Lombok >= 1.18.24

Lombok是什么?

Project Lombok(Lombok)是一个基于注解的Java库,允许你减少模板代码。

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

[日积月累]Lombok注解学习笔记

例如,通过使用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文件

[日积月累]Lombok注解学习笔记

具体实现情况如下:

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

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

[日积月累]Lombok注解学习笔记

如何为项目引入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 常用注解大全

[日积月累]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万现金大奖」