@Data注解在Boolean類(lèi)型屬性上的大坑及解決
@Data注解在Boolean類(lèi)型屬性上的大坑
直接看總結(jié)吧
問(wèn)題描述
將A類(lèi)的值拷貝到B類(lèi),且A類(lèi)中多余的屬性存放到B類(lèi)的extraElement屬性中;
發(fā)現(xiàn)問(wèn)題:Boolean屬性的字段沒(méi)有完成拷貝
具體描述信息
- 類(lèi)A:
@Data public class A { private String id; private String name; private boolean sex; }
- 類(lèi)B:
@Data public class B { private String id; private String extraElement; }
拷貝的代碼
public static void main(String[] args) { A a = new A(); a.setId(Pub.getUUID()); a.setSex(true); a.setName("test"); B b = new B(); ToolBeans.copyPropertiesToExtra( a, b, "extraElement" ); System.out.println(a); System.out.println(b); System.out.println(b.getExtraElement()); } public static <F, T> void copyPropertiesToExtra( F from, T to, String extra ) { MethodAccess fromMethodAccess = get( from.getClass() ); MethodAccess toMethodAccess = get( to.getClass() ); Field[] fromDeclaredFields = from.getClass().getDeclaredFields(); // 獲取來(lái)源的字段 JSONObject extraJson = new JSONObject(); for ( Field field : fromDeclaredFields ) { String name = field.getName(); Object value = null; try { value = fromMethodAccess.invoke( from, "get" + StringUtils.capitalize( name ), null ); toMethodAccess.invoke( to, "set" + StringUtils.capitalize( name ), value ); } catch ( Exception e ) { // 設(shè)置異常,可能會(huì)沒(méi)有對(duì)應(yīng)字段,忽略 extraJson.put( name, value ); } } try { toMethodAccess.invoke( to, "set" + StringUtils.capitalize( extra ), extraJson.toJSONString() ); } catch ( Exception e ) { log.error( "將數(shù)據(jù)放置到擴(kuò)展字段失敗", e ); } }
結(jié)果
可以明顯看到id屬性已經(jīng)拷貝成功,多余的屬性name和sex name已經(jīng)進(jìn)入了extraElement中,唯獨(dú)sex沒(méi)有拷貝成功
發(fā)現(xiàn)原因
通過(guò)追源碼后發(fā)現(xiàn)
對(duì)于Boolean類(lèi)型的數(shù)據(jù), @Data給到的get方法名默認(rèn)為isSex而不是getSex
問(wèn)題解決
手動(dòng)添加get方法,覆蓋掉@Data注解的方法
再次運(yùn)行:
問(wèn)題解決!
問(wèn)題總結(jié)
添加@Data注解時(shí), 如果有boolean屬性的數(shù)據(jù),且屬性的名字還不是is開(kāi)頭的,則默認(rèn)的get方法就會(huì)把is給加上
場(chǎng)景1
boolean sex;
在加上@Data注解后得到的get set方法為
set方法正常但get方法是 isSex() 而不是 getSex()
場(chǎng)景2
如果已經(jīng)有了is則就是正常形式了:
boolean isGirl;
在加上@Data注解后得到的get,set方法為
- get方法為isGirl() 而不是getIsGirl()
- set方法為setGirl 而不是setIsGirl()
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Synchronized字節(jié)碼層分析體驗(yàn)
這篇文章主要介紹了Java Synchronized字節(jié)碼層分析,synchronized關(guān)鍵字解決了多個(gè)線(xiàn)程之間的資源同步性,synchronized關(guān)鍵字保證了它修飾的方法或者代碼塊任意時(shí)刻只有一個(gè)線(xiàn)程在訪(fǎng)問(wèn)2023-04-04SpringBoot應(yīng)用線(xiàn)上重啟腳本的命令詳解
這篇文章主要介紹了SpringBoot應(yīng)用線(xiàn)上重啟腳本,通過(guò)查找應(yīng)用進(jìn)程PID,殺死應(yīng)用進(jìn)程PID,運(yùn)行啟動(dòng)腳本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07SpringMVC五大組件與執(zhí)行原理分析總結(jié)
這篇文章主要介紹了SpringMVC五大組件與執(zhí)行原理分析總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01Java 對(duì)10個(gè)數(shù)進(jìn)行排序的實(shí)現(xiàn)代碼
可以利用選擇法,即從后9個(gè)比較過(guò)程中,選擇一個(gè)最小的與第一個(gè)元素交換, 下次類(lèi)推,即用第二個(gè)元素與后8個(gè)進(jìn)行比較,并進(jìn)行交換2017-02-02