首頁 > 軟體

java Lombok之@Accessors用法及說明

2023-09-06 14:01:56

java Lombok之@Accessors用法

之前用Lombok,只是為了省去寫get和set方法,在學習的時候,突然發現,Accessors這個特殊的屬性註解竟然還有如此強大的功能,特此為自己的無知記錄一下。

fluent屬性

fluent:流暢的,流利的意思,設定為true,則getter和setter方法的方法名都是基礎屬性名,且setter方法返回當前物件。

@Data
@Accessors(fluent = true)
public class User {
    private int id;
    private String name;
}

可以看到,當我們使用get或者set方法的時候,方法名都是基礎的屬性名稱,非常的簡潔

chain屬性

chain:鏈式的,設定為true,則setter方法返回當前物件。

@Data
@Accessors(chain = true)
public class User {
    private int id;
    private String name;
}

如上圖可以看出,和常規的get和set方法名稱一致,不過區別就是set方法返回的是物件名稱,更加的直觀,適合物件賦值時的連續賦值引數。

prefix屬性

prefix:字首,用於生成getter和setter方法的欄位名會忽視指定字首(遵守駝峰命名)。

@Data
@Accessors(prefix = {"tb","tbn"})
public class User {
    private int tb_id;
    private String tbn_name;
}

可以看出,方法中的get和set方法均過濾了相關的字首屬性,看起來更加的簡潔。

Lombok @Data @Accessors註解遇到的坑

碰到個反射的問題,原資料是一個 map,對應資料庫表的鍵值對,此時需要將這個 map 轉換成 Entity,所以會用到反射。

用了 Apache BeanUtils,用了 BeanMap 都是不行,無法反射。

如下程式碼

import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.cglib.beans.BeanMap;
 
import java.util.HashMap;
import java.util.Map;
 
public class Test {
 
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", "111");
        map.put("name", "xxxx");
 
        Model model = new Model();
        BeanMap.create(model).putAll(map);
        System.out.println(JSON.toJSONString(model));
    }
 
    @Data
    @Accessors(chain = true)
    public static class Model {
        private String id;
        private String name;
    }
}

此時你會發現其實沒問題,但是輸出結果如下:

{}

此時辦法已經試遍了,後來修改 Entity,將 lombok 註解去掉,發現就OK了。此時不用想,肯定是遇到坑了,然後排查之後發現是 @Accessors 的問題,將其去掉就OK了。

如下:

import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.cglib.beans.BeanMap;
 
import java.util.HashMap;
import java.util.Map;
 
public class Test {
 
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", "111");
        map.put("name", "xxxx");
 
        Model model = new Model();
        BeanMap.create(model).putAll(map);
        System.out.println(JSON.toJSONString(model));
    }
 
    @Data
    public static class Model {
        private String id;
        private String name;
    }
}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com