溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Lombok的功能是什么

發(fā)布時(shí)間:2021-10-14 10:02:59 來(lái)源:億速云 閱讀:129 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“Lombok的功能是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Lombok的功能是什么”吧!

什么是 lombok

Lombok項(xiàng)目是一個(gè)Java庫(kù),工具庫(kù),它會(huì)自動(dòng)在編輯器或構(gòu)建工具中生成代碼,從而使你的Java代碼更簡(jiǎn)潔。不用在給每一個(gè)變量生成get和set等方法,還會(huì)生成一個(gè)功能齊全的Builder,已經(jīng)自動(dòng)化日志記錄變量,以及更多

常用注解

  • @Setter

  • @Getter

  • @Builder

  • @RequiredArgsConstructor 生成一個(gè)該類(lèi)的構(gòu)造方法,禁止無(wú)參數(shù)構(gòu)造

  • @ToString 重寫(xiě)該類(lèi)的 toString()方法

  • @EqualsAndHashCode 重寫(xiě)該類(lèi)的equals() 和 hashCode() 方法

  • @NoArgsConstructor

  • @AllArgsConstructor

  • @Data 等同于 @Setter @Getter @RequiredArgsConstructor @ToString @EqualsAndHashCode 注解之和

  • @Slf4j

寫(xiě)一個(gè)簡(jiǎn)單的類(lèi) 使用這個(gè)類(lèi)來(lái)詳細(xì)的的看一下 Lombok 幫我們做了什么

package lombok;
public class UserData {
    private String name;
    private int age;
    private boolean good;
}

這個(gè)類(lèi)很簡(jiǎn)單 代碼中沒(méi)有構(gòu)造函數(shù)、沒(méi)有g(shù)et set 方法 使用 javap 工具來(lái)看一下

javap 是 jdk 自帶的反編譯工具、這里先不關(guān)心生成的字節(jié)碼 只看方法

// javap UserData.class
Compiled from "UserData.java"
public class lombok.UserData {
  public lombok.UserData();
}

JDK當(dāng)檢測(cè)到?jīng)]有默認(rèn)構(gòu)造器時(shí),自動(dòng)生成一個(gè) public 的無(wú)參數(shù)默認(rèn)構(gòu)造器

使用 @Getter

在類(lèi) UserData 上增加注解 @Getter

Compiled from "UserData.java"
public class lombok.UserData {
  public lombok.UserData();
  public java.lang.String getName();
  public int getAge();
  public boolean isGood();
}

反編譯后 看到使用駝峰命名方式 增加 get 變量方法 需要注意 boolean 類(lèi)型 使用的 is 方法

使用 @Setter
Compiled from "UserData.java"
public class lombok.UserData {
  public lombok.UserData();
  public void setName(java.lang.String);
  public void setAge(int);
  public void setGood(boolean);
}

反編譯后 增加 set 變量方法

使用 @RequiredArgsConstructor
Compiled from "UserData.java"
public class lombok.UserData {
  public lombok.UserData();
}

反編譯后 可以看到 和沒(méi)有注解是一樣的 生成一個(gè) 無(wú)參數(shù)構(gòu)造函數(shù)

使用 @ToString
public class lombok.UserData {
  public lombok.UserData();
  public java.lang.String toString();
}

反編譯后 可以看到 增加 toString 方法 這里的toString和原生的是有區(qū)別的

System.out.println(new UserData().toString());
// 原生toString輸出
lombok.UserData@60e53b93 每次生成引用地址會(huì)變化
// @ToString輸出
UserData(name=null, age=0, good=false)
使用 @EqualsAndHashCode
Compiled from "UserData.java"
public class lombok.UserData {
  public lombok.UserData();
  public boolean equals(java.lang.Object);
  protected boolean canEqual(java.lang.Object);
  public int hashCode();
}

反編譯后 可以看到 增加 equals canEqual hashCode 三個(gè)方法

和原生對(duì)比下輸出

public static void main(String[] args) {
        UserData userData = new UserData();
        System.out.println(userData.equals(new UserData()));
        System.out.println(userData.canEqual(new UserData()));
        System.out.println(userData.hashCode());
    }
// 原生輸出
false
// 沒(méi)有 canEqual 方法
1625635731
// @EqualsAndHashCode 輸出
true
true
355159

通過(guò)上面的輸出對(duì)比 明顯加注解后的結(jié)果 和 原生的equals 不一樣,建議_謹(jǐn)慎使用_

可以使用 Idea 反編譯下 看看生成的代碼邏輯 這里就不展示了 有興趣的可以自己試下

增加 @Data 注解

來(lái)看一下這個(gè)懶人注解 也是用的最廣泛的注解 @Data

Compiled from "UserData.java"
public class lombok.UserData {
  public lombok.UserData();
  public java.lang.String getName();
  public int getAge();
  public boolean isGood();
  public void setName(java.lang.String);
  public void setAge(int);
  public void setGood(boolean);
  public boolean equals(java.lang.Object);
  protected boolean canEqual(java.lang.Object);
  public int hashCode();
  public java.lang.String toString();
}

反編譯后可以看出 它是 @Getter @Setter @EqualsAndHashCode @ToString 的集合體

這里還是建議謹(jǐn)慎使用 主要是 @EqualsAndHashCode 注解生成的代碼 會(huì)影響 equal 的判斷

使用 @NoArgsConstructor
Compiled from "UserData.java"
public class lombok.UserData {
  public lombok.UserData();
}

反編譯后 可以看到 和使用 @RequiredArgsConstructor 和沒(méi)有注解一樣的

使用 @AllArgsConstructor
Compiled from "UserData.java"
public class lombok.UserData {
  public lombok.UserData(java.lang.String, int, boolean);
}

反編譯后 看出 沒(méi)有無(wú)參數(shù)構(gòu)造函數(shù) 增加一個(gè)全參數(shù)構(gòu)造函數(shù)

使用 @Builder
編譯后多了一個(gè)內(nèi)部類(lèi) UserData$UserDataBuilder.class
Compiled from "UserData.java"
public class lombok.UserData$UserDataBuilder {
  lombok.UserData$UserDataBuilder();
  public lombok.UserData$UserDataBuilder name(java.lang.String);
  public lombok.UserData$UserDataBuilder age(int);
  public lombok.UserData$UserDataBuilder good(boolean);
  public lombok.UserData build();
  public java.lang.String toString();
}

Compiled from "UserData.java"
public class lombok.UserData {
  lombok.UserData(java.lang.String, int, boolean);
  public static lombok.UserData$UserDataBuilder builder();
}

生成了一個(gè)全參數(shù)構(gòu)造函數(shù) 和 一個(gè) builder 方法

參考

https://projectlombok.org/

javap -verbose UserData

Classfile /***/classes/lombok/UserData.class
  Last modified 2021-4-13; size 1975 bytes
  MD5 checksum 3fe9c971d14ecbcecdc5be0c02e7907e
  Compiled from "UserData.java"
public class lombok.UserData
  minor version: 0
  major version: 52 // 便衣使用的JDK版本  
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool: // 常量池
   #1 = Methodref          #22.#66        // java/lang/Object."<init>":()V
   #2 = Fieldref           #5.#67         // lombok/UserData.name:Ljava/lang/String;
   #3 = Fieldref           #5.#68         // lombok/UserData.age:I
   #4 = Fieldref           #5.#69         // lombok/UserData.good:Z
   #5 = Class              #70            // lombok/UserData
   #6 = Methodref          #5.#71         // lombok/UserData.canEqual:(Ljava/lang/Object;)Z
   #7 = Methodref          #5.#72         // lombok/UserData.getName:()Ljava/lang/String;
   #8 = Methodref          #22.#73        // java/lang/Object.equals:(Ljava/lang/Object;)Z
   #9 = Methodref          #5.#74         // lombok/UserData.getAge:()I
  #10 = Methodref          #5.#75         // lombok/UserData.isGood:()Z
  #11 = Methodref          #22.#76        // java/lang/Object.hashCode:()I
  #12 = Class              #77            // java/lang/StringBuilder
  #13 = Methodref          #12.#66        // java/lang/StringBuilder."<init>":()V
  #14 = String             #78            // UserData(name=
  #15 = Methodref          #12.#79        // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #16 = String             #80            // , age=
  #17 = Methodref          #12.#81        // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  #18 = String             #82            // , good=
  #19 = Methodref          #12.#83        // java/lang/StringBuilder.append:(Z)Ljava/lang/StringBuilder;
  #20 = String             #84            // )
  #21 = Methodref          #12.#85        // java/lang/StringBuilder.toString:()Ljava/lang/String;
  #22 = Class              #86            // java/lang/Object
  #23 = Utf8               name
  #24 = Utf8               Ljava/lang/String;
  #25 = Utf8               age
  #26 = Utf8               I
  #27 = Utf8               good
  #28 = Utf8               Z
  #29 = Utf8               <init>
  #30 = Utf8               ()V
  #31 = Utf8               Code
  #32 = Utf8               LineNumberTable
  #33 = Utf8               LocalVariableTable
  #34 = Utf8               this
  #35 = Utf8               Llombok/UserData;
  #36 = Utf8               getName
  #37 = Utf8               ()Ljava/lang/String;
  #38 = Utf8               getAge
  #39 = Utf8               ()I
  #40 = Utf8               isGood
  #41 = Utf8               ()Z
  #42 = Utf8               setName
  #43 = Utf8               (Ljava/lang/String;)V
  #44 = Utf8               setAge
  #45 = Utf8               (I)V
  #46 = Utf8               setGood
  #47 = Utf8               (Z)V
  #48 = Utf8               equals
  #49 = Utf8               (Ljava/lang/Object;)Z
  #50 = Utf8               o
  #51 = Utf8               Ljava/lang/Object;
  #52 = Utf8               other
  #53 = Utf8               this$name
  #54 = Utf8               other$name
  #55 = Utf8               StackMapTable
  #56 = Class              #70            // lombok/UserData
  #57 = Class              #86            // java/lang/Object
  #58 = Utf8               canEqual
  #59 = Utf8               hashCode
  #60 = Utf8               PRIME
  #61 = Utf8               result
  #62 = Utf8               $name
  #63 = Utf8               toString
  #64 = Utf8               SourceFile
  #65 = Utf8               UserData.java
  #66 = NameAndType        #29:#30        // "<init>":()V
  #67 = NameAndType        #23:#24        // name:Ljava/lang/String;
  #68 = NameAndType        #25:#26        // age:I
  #69 = NameAndType        #27:#28        // good:Z
  #70 = Utf8               lombok/UserData
  #71 = NameAndType        #58:#49        // canEqual:(Ljava/lang/Object;)Z
  #72 = NameAndType        #36:#37        // getName:()Ljava/lang/String;
  #73 = NameAndType        #48:#49        // equals:(Ljava/lang/Object;)Z
  #74 = NameAndType        #38:#39        // getAge:()I
  #75 = NameAndType        #40:#41        // isGood:()Z
  #76 = NameAndType        #59:#39        // hashCode:()I
  #77 = Utf8               java/lang/StringBuilder
  #78 = Utf8               UserData(name=
  #79 = NameAndType        #87:#88        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #80 = Utf8               , age=
  #81 = NameAndType        #87:#89        // append:(I)Ljava/lang/StringBuilder;
  #82 = Utf8               , good=
  #83 = NameAndType        #87:#90        // append:(Z)Ljava/lang/StringBuilder;
  #84 = Utf8               )
  #85 = NameAndType        #63:#37        // toString:()Ljava/lang/String;
  #86 = Utf8               java/lang/Object
  #87 = Utf8               append
  #88 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #89 = Utf8               (I)Ljava/lang/StringBuilder;
  #90 = Utf8               (Z)Ljava/lang/StringBuilder;
{
  public lombok.UserData();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable: // 源代碼行號(hào)和字節(jié)碼的對(duì)應(yīng)關(guān)系
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Llombok/UserData;

  public java.lang.String getName();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #2                  // Field name:Ljava/lang/String;
         4: areturn
      LineNumberTable:
        line 6: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Llombok/UserData;

  public int getAge();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #3                  // Field age:I
         4: ireturn
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Llombok/UserData;

  public boolean isGood();
    descriptor: ()Z
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #4                  // Field good:Z
         4: ireturn
      LineNumberTable:
        line 10: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Llombok/UserData;

  public void setName(java.lang.String);
    descriptor: (Ljava/lang/String;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: putfield      #2                  // Field name:Ljava/lang/String;
         5: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Llombok/UserData;
            0       6     1  name   Ljava/lang/String;

  public void setAge(int);
    descriptor: (I)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: iload_1
         2: putfield      #3                  // Field age:I
         5: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Llombok/UserData;
            0       6     1   age   I

  public void setGood(boolean);
    descriptor: (Z)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: iload_1
         2: putfield      #4                  // Field good:Z
         5: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Llombok/UserData;
            0       6     1  good   Z

  public boolean equals(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=5, args_size=2
         0: aload_1
         1: aload_0
         2: if_acmpne     7
         5: iconst_1
         6: ireturn
         7: aload_1
         8: instanceof    #5                  // class lombok/UserData
        11: ifne          16
        14: iconst_0
        15: ireturn
        16: aload_1
        17: checkcast     #5                  // class lombok/UserData
        20: astore_2
        21: aload_2
        22: aload_0
        23: invokevirtual #6                  // Method canEqual:(Ljava/lang/Object;)Z
        26: ifne          31
        29: iconst_0
        30: ireturn
        31: aload_0
        32: invokevirtual #7                  // Method getName:()Ljava/lang/String;
        35: astore_3
        36: aload_2
        37: invokevirtual #7                  // Method getName:()Ljava/lang/String;
        40: astore        4
        42: aload_3
        43: ifnonnull     54
        46: aload         4
        48: ifnull        65
        51: goto          63
        54: aload_3
        55: aload         4
        57: invokevirtual #8                  // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
        60: ifne          65
        63: iconst_0
        64: ireturn
        65: aload_0
        66: invokevirtual #9                  // Method getAge:()I
        69: aload_2
        70: invokevirtual #9                  // Method getAge:()I
        73: if_icmpeq     78
        76: iconst_0
        77: ireturn
        78: aload_0
        79: invokevirtual #10                 // Method isGood:()Z
        82: aload_2
        83: invokevirtual #10                 // Method isGood:()Z
        86: if_icmpeq     91
        89: iconst_0
        90: ireturn
        91: iconst_1
        92: ireturn
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      93     0  this   Llombok/UserData;
            0      93     1     o   Ljava/lang/Object;
           21      72     2 other   Llombok/UserData;
           36      57     3 this$name   Ljava/lang/Object;
           42      51     4 other$name   Ljava/lang/Object;
      StackMapTable: number_of_entries = 8
        frame_type = 7 /* same */
        frame_type = 8 /* same */
        frame_type = 252 /* append */
          offset_delta = 14
          locals = [ class lombok/UserData ]
        frame_type = 253 /* append */
          offset_delta = 22
          locals = [ class java/lang/Object, class java/lang/Object ]
        frame_type = 8 /* same */
        frame_type = 1 /* same */
        frame_type = 12 /* same */
        frame_type = 12 /* same */

  protected boolean canEqual(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
    flags: ACC_PROTECTED
    Code:
      stack=1, locals=2, args_size=2
         0: aload_1
         1: instanceof    #5                  // class lombok/UserData
         4: ireturn
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Llombok/UserData;
            0       5     1 other   Ljava/lang/Object;

  public int hashCode();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=4, args_size=1
         0: bipush        59
         2: istore_1
         3: iconst_1
         4: istore_2
         5: aload_0
         6: invokevirtual #7                  // Method getName:()Ljava/lang/String;
         9: astore_3
        10: iload_2
        11: bipush        59
        13: imul
        14: aload_3
        15: ifnonnull     23
        18: bipush        43
        20: goto          27
        23: aload_3
        24: invokevirtual #11                 // Method java/lang/Object.hashCode:()I
        27: iadd
        28: istore_2
        29: iload_2
        30: bipush        59
        32: imul
        33: aload_0
        34: invokevirtual #9                  // Method getAge:()I
        37: iadd
        38: istore_2
        39: iload_2
        40: bipush        59
        42: imul
        43: aload_0
        44: invokevirtual #10                 // Method isGood:()Z
        47: ifeq          55
        50: bipush        79
        52: goto          57
        55: bipush        97
        57: iadd
        58: istore_2
        59: iload_2
        60: ireturn
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      61     0  this   Llombok/UserData;
            3      58     1 PRIME   I
            5      56     2 result   I
           10      51     3 $name   Ljava/lang/Object;
      StackMapTable: number_of_entries = 4
        frame_type = 255 /* full_frame */
          offset_delta = 23
          locals = [ class lombok/UserData, int, int, class java/lang/Object ]
          stack = [ int ]
        frame_type = 255 /* full_frame */
          offset_delta = 3
          locals = [ class lombok/UserData, int, int, class java/lang/Object ]
          stack = [ int, int ]
        frame_type = 91 /* same_locals_1_stack_item */
          stack = [ int ]
        frame_type = 255 /* full_frame */
          offset_delta = 1
          locals = [ class lombok/UserData, int, int, class java/lang/Object ]
          stack = [ int, int ]

  public java.lang.String toString();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: new           #12                 // class java/lang/StringBuilder
         3: dup
         4: invokespecial #13                 // Method java/lang/StringBuilder."<init>":()V
         7: ldc           #14                 // String UserData(name=
         9: invokevirtual #15                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        12: aload_0
        13: invokevirtual #7                  // Method getName:()Ljava/lang/String;
        16: invokevirtual #15                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        19: ldc           #16                 // String , age=
        21: invokevirtual #15                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        24: aload_0
        25: invokevirtual #9                  // Method getAge:()I
        28: invokevirtual #17                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
        31: ldc           #18                 // String , good=
        33: invokevirtual #15                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        36: aload_0
        37: invokevirtual #10                 // Method isGood:()Z
        40: invokevirtual #19                 // Method java/lang/StringBuilder.append:(Z)Ljava/lang/StringBuilder;
        43: ldc           #20                 // String )
        45: invokevirtual #15                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        48: invokevirtual #21                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        51: areturn
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      52     0  this   Llombok/UserData;
}
SourceFile: "UserData.java"

到此,相信大家對(duì)“Lombok的功能是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI