Lombok

2021-07-19 14:49:35 浏览数 (1)

有人中意简洁的代码,有人诟病Lombok的侵入性,而我因为接手的项目不得不用

1. Lombok

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, automate your logging variables, and much more —— Project Lombok


Lombok项目是一个Java库,可自动插入你的编辑器以及构建工具,为你的Java增添趣味。再也不用写额外的getter或equals方法,通过一个注解,你的类就有一个功能齐全的构造器,自动记录变量,等等。

感受使用Lombok的快捷与简便,下面二者功能相同

代码语言:javascript复制
// 常规代码
public class User {
    private String username;
    private String password;
    private String email;

    // 省略各种getter、setter
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    // 重写toString方法
    @Override
    public String toString() {
        return "User{"  
                "username='"   username   '''  
                ", password='"   password   '''  
                ", email='"   email   '''  
                '}';
    }

    // 重写equals和hashCode方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(username, user.username) &&
                Objects.equals(password, user.password) &&
                Objects.equals(email, user.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(username, password, email);
    }
}
代码语言:javascript复制
// 使用了Lombok
@Data
public class User {
    private String username;
    private String password;
    private String email;
}

这个注解包括了 Getter、Setter、RequiredArgsConstructor、ToString、EqualsAndHashCode(后面会解释)

2. 操作原理

Lombok使用到注解,那么我们就从注解开始入手,注解的解析分为:

  • 运行时解析:@Retention设置为RUNTIME,利用反射拿到注解
  • 编译时解析
    • Annotation Processing Tool:注解处理工具,已经废弃了
    • Pluggable Annotation Processing API:拔插式注解处理接口,集成到了javac中

我们知道,javac让我们写的代码 .java编译成 .class,配合 拔插式注解处理接口 其编译过程如下:

  1. javac分析源代码,生成抽象语法树(AST)
  2. javac运行中调用实现 拔插式注解处理接口 的Lombok项目(lombok.jar)
  3. Lombok修改@Data注解所在类对应的语法树(AST),增添getter、setter等方法相应的树节点
  4. javac使用修改后的抽象语法树(AST)生成字节码文件

一句话就是:Lombok修改了抽象语法树(AST),导致javac生成增强功能的字节码,也就是新的类

3. 安装和使用

3.1 安装

Lombok集成到 javac中作为一个注解处理器来启动。在IDEA中用插件的形式来支持Lombok,所以要使用则要先安装插件,然后再启动注解处理器

3.2 依赖

使用的话当然要加依赖了,以maven项目为例:

代码语言:javascript复制
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>

3.3 使用

怎样使用?直接在类上,变量,方法上加注解,常见的注解如下:

注解

解释

@Gette、@Setter

生成getter、setter方法

@ToString

重写toString方法

@EqualsAndHashCode

重写hashCode、equals方法

@NoArgsConstructor

无参构造

@AllArgsConstructor

全参构造

@RequiredArgsConstructor

按照要求生成构造器(final、@NotNull修饰的变量)

@Data

Getter、Setter、RequiredArgsConstructor、ToString、EqualsAndHashCode

@Builder

生成的对象可链式调用set

@Slf4j(还有其它的log注解)

不用再new一个log对象,可直接调用 log.info("日志")

@NonNull

非空检查,否则抛出空指针异常

@Cleanup

修饰的变量会自动关闭资源,调用close方法

4. 缺点

  • 强迫使用:代码中使用了Lombok,那么别人也得安装Lombok才能正常编译
  • JDK版本问题:既然使用了lombok.jar依赖,难免会有版本问题
  • 代码调试性降低:编译时期才增添方法,若想知道这些方法在哪里被引用则较麻烦

0 人点赞