Lombok常用注解及使用

说明:本文是博学谷课程整理的笔记,课程地址:https://xuexi.boxuegu.com/video.html?courseId=1586

lombok官网:https://projectlombok.org/

一、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.

简单说:

Lombok项目是一个Java实用工具库,可以用来帮助开发人员消除Java中的冗长代码,尤其是对于简单的Java对象(POJO),它通过注解来实现这一目的。

2. Lombok原理

JSR 269:插件化注解处理API(Pluggable Annotation Processing API)——编译期(SOURCE)注解,不同于运行期(RUNTIME)注解

官网:https://www.jcp.org/en/jsr/detail?id=269

JDK6提供的特性,在Javac编译期利用注解搞事情!

在这里插入图片描述

3. Lombok安装

3.1 javac
  • 拷贝jar到类路径
  • javac -cp lombok.jar ...
3.2 Maven
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>
3.3 Intellij IDEA

官网:https://projectlombok.org/setup/intellij

Add the Lombok IntelliJ plugin to add lombok support for IntelliJ:

  • Go to File > Settings > Plugins
  • Click on Browse repositories...
  • Search for Lombok Plugin
  • Click on Install plugin
  • Restart IntelliJ IDEA

在这里插入图片描述
在这里插入图片描述

二、Lombok常用注解

在这里插入图片描述

1. @Getter/@Setter

package top.onefine.lombok;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

// 给所有类中的成员变量生成get/set方法
// 不对static类型产生效果
// 对final类型只会产生get方法,不会产生set方法
@Setter
@Getter
public class User {
	static String s = "";
    final int id2 = 10;
    // 只给id字段添加get/set方法
//    @Getter(AccessLevel.PROTECTED)  // 默认public
//    @Setter  // 默认public
    private Integer id;
    private String userName;
    private String password;
    private String phone;
    @Getter(AccessLevel.NONE)  // 不会生成对应的get方法,@Setter同理
    private String email;
}

2. @ToString

package top.onefine.lombok;

import lombok.ToString;

//@ToString  // 不会打印static类型的
//@ToString(exclude = {"email", "phone"})  // 不打印成员变量email和phone
@ToString(of = {"id2", "userName"})  // 只打印id和成员变量userName
public class User {
    static String s = "";  // 不会打印
    final int id2 = 10;
    private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;
}

3. @EqualsAndHashCode

package top.onefine.lombok;

import lombok.EqualsAndHashCode;

//@EqualsAndHashCode  // 自动生成equals、canEqual、hashCode方法
//@EqualsAndHashCode(exclude = {"phone", "password"})  // 判断时不比较phone和password字段
@EqualsAndHashCode(of = {"id"})  // 只根据id判断
public class User {
    static String s = "";
    final int id2 = 10;
    private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;
}

4. @NonNull

package top.onefine.lombok;

import lombok.NonNull;

public class User {
	@NonNull private Integer id;
	
    public void test(@NonNull String str) {  // 对实参str进行判断,不允许其为空
        System.out.println(str);
    }

    public static void main(String[] args) {
        new User().test(null);
    }
}

在这里插入图片描述

在这里插入图片描述

对class字节码反编译之后发现:

	// ...
	@NonNull
    private Integer id;
	
	// ...	
	public void test(@NonNull String str) {
        if (str == null) {
            throw new NullPointerException("str is marked non-null but is null");
        } else {
            System.out.println(str);
        }
    }

5. @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

package top.onefine.lombok;

import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

//@NoArgsConstructor  // 添加无参构造函数
@RequiredArgsConstructor  // 默认对标识NonNull注解或final关键字(不指定值的情况下;但是此时不能有无参的构造函数)的成员变量生成构造函数
public class User {
    static String s = "";
    final int id2;  // = 10;
    @NonNull private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;
}

反编译之后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package top.onefine.lombok;

import lombok.NonNull;

public class User {
    static String s = "";
    final int id2;
    @NonNull
    private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;

    public User(int id2, @NonNull Integer id) {
        if (id == null) {
            throw new NullPointerException("id is marked non-null but is null");
        } else {
            this.id2 = id2;
            this.id = id;
        }
    }
}
package top.onefine.lombok;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

//@NoArgsConstructor  // 添加无参构造函数
//@RequiredArgsConstructor  // 默认对标识NonNull注解或final关键字(不指定值的情况下;但是此时不能有无参的构造函数)的成员变量生成构造函数
@AllArgsConstructor  // 生成所有字段的构造函数
public class User {
    static String s = "";
    final int id2;  // = 10;
    @NonNull private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;
}

反编译之后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package top.onefine.lombok;

import lombok.NonNull;

public class User {
    static String s = "";
    final int id2;
    @NonNull
    private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;

    public User(int id2, @NonNull Integer id, String userName, String password, String phone, String email) {
        if (id == null) {
            throw new NullPointerException("id is marked non-null but is null");
        } else {
            this.id2 = id2;
            this.id = id;
            this.userName = userName;
            this.password = password;
            this.phone = phone;
            this.email = email;
        }
    }
}

6. @Data

package top.onefine.lombok;

import lombok.Data;
import lombok.NonNull;

@Data
public class User {
    static String s = "";
    final int id2; // = 10;
    @NonNull private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;
}

直接上图:

在这里插入图片描述

@Data集成了@Getter/@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor四个注解。

7. @Builder

package top.onefine.lombok;

import lombok.Builder;
import lombok.NonNull;

@Builder
public class User {
    static String s = "";
    final int id2 = 10;
    @NonNull private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;
}

直接上图:
在这里插入图片描述
反编译结果:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package top.onefine.lombok;

import lombok.NonNull;

public class User {
    static String s = "";
    final int id2 = 10;
    @NonNull
    private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;

    User(@NonNull Integer id, String userName, String password, String phone, String email) {
        if (id == null) {
            throw new NullPointerException("id is marked non-null but is null");
        } else {
            this.id = id;
            this.userName = userName;
            this.password = password;
            this.phone = phone;
            this.email = email;
        }
    }

    public static top.onefine.lombok.User.UserBuilder builder() {
        return new top.onefine.lombok.User.UserBuilder();
    }
}

用法:

package top.onefine.lombok;

import lombok.Builder;
import lombok.NonNull;
import lombok.ToString;

@Builder
@ToString
public class User {
    static String s = "";
    final int id2 = 10;
    @NonNull private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;

    public static void main(String[] args) {
        User user = User.builder().id(123).email("wf963123china@gmail.com").userName("one fine").build();// ...
        System.out.println(user);

    }
}

执行结果:

User(id2=10, id=123, userName=one fine, password=null, phone=null, email=wf963123china@gmail.com)

8. @Log

package top.onefine.lombok;


import lombok.NonNull;
import lombok.extern.java.Log;

@Log
public class User {
    static String s = "";
    final int id2 = 10;
    @NonNull private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;

    public static void main(String[] args) {
        log.info("info msg...");
    }

}

执行结果:

3月 09, 2020 11:29:31 下午 top.onefine.lombok.User main
信息: info msg...

反编译之后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package top.onefine.lombok;

import java.util.logging.Logger;
import lombok.NonNull;

public class User {
    private static final Logger log = Logger.getLogger(User.class.getName());
    static String s = "";
    final int id2 = 10;
    @NonNull
    private Integer id;
    private String userName;
    private String password;
    private String phone;
    private String email;

    public User() {
    }

    public static void main(String[] args) {
        log.info("info msg...");
    }
}

9. val

package top.onefine.lombok;

import java.util.HashMap;
import lombok.val;

public class User {

    public static void main(String[] args) {
//        HashMap<String, String> map = new HashMap<>();
        val map = new HashMap<String, String>();
        map.put("name", "one fine");
    }
}

反编译后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package top.onefine.lombok;

import java.util.HashMap;

public class User {
    public User() {
    }

    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap();
        map.put("name", "one fine");
    }
}

10. @Cleanup

package top.onefine.lombok;

import java.io.*;

import lombok.Cleanup;

public class User {
    
    public static void main(String[] args) throws IOException {
        @Cleanup InputStream in = new FileInputStream("path1");  // 不用手动关闭
        @Cleanup OutputStream out = new FileOutputStream("path2");  // 不用手动关闭

        byte[] b = new byte[100];
        while (true) {
            int r = in.read(b);
            if (r == -1)
                break;
            out.write(b, 0, r);
        }
           
    }
}

字节码反编译之后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package top.onefine.lombok;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collections;

public class User {
    public User() {
    }

    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("path1");

        try {
            FileOutputStream out = new FileOutputStream("path2");

            try {
                byte[] b = new byte[100];

                while(true) {
                    int r = in.read(b);
                    if (r == -1) {
                        return;
                    }

                    out.write(b, 0, r);
                }
            } finally {
                if (Collections.singletonList(out).get(0) != null) {
                    out.close();
                }

            }
        } finally {
            if (Collections.singletonList(in).get(0) != null) {
                in.close();
            }

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值