解決Beanutils.copyproperties實體類對象不一致的問題
今天給大家分析一個解決Beanutils.copyproperties實體類對象名不一致的解決方法,一般我們在兩個對象拷貝的問題上,我個人用的比較多的就是Beanutils.copyproperties,字段名如果不一致的話就去實體類中使用重載,把當前實體類的對象賦值給另外一個對象,也有用到set(),當然這些也都能解決Beanutils.copyproperties實體類屬性不一致的問題,不過今天要給大家分享的是,不用set()和實體類的重構(gòu),使用類的反射機制去完成!
話不多說直接開始:
我是選擇重寫了一個實體類copy工具類首先要獲取傳過來的兩個對象的類( getClass() 方法),
通過獲取類再去獲取對象中的屬性
( getDeclaredFields() 方法)
fieId.setAccessible(true) 方法是false時不允許通過反射訪問該字段,所以要設(shè)置成true用一個HashMap去接受,
第二個類也是一樣的操作
都說了是解決實體類屬性不一致的方法啦,所以實體類要有不一樣的字段,那么我們應(yīng)該怎么讓系統(tǒng)知道這個字段和那個字段是要干一件事情呢?
就比如,欸我今天不去釣魚,要去當舔🐕,就是玩,朋友他只能去當舔🐕,我們的目的都是當舔🐕,但是出發(fā)點都是不同,所以要讓系統(tǒng)知道我們要去干嘛 這時候要用到一個注解(FieldMap )讓系統(tǒng)清楚我們要去干同一件事情
這是FieldMap類
既然我們已經(jīng)讓系統(tǒng)知道了誰要去干嘛了,當然要去獲取他了,這時候就要用到fleId.getAnnotation()方法了,獲取注解上的Name的值,然后拿Name的值去做判斷,所以用到了getType()去獲取類型去做判斷
這樣就解決了Beanutils.copyproperties實體類對象不一致就copy不進去的問題了。
spring的BeanUtils.copyProperties(obj1, obj2);復(fù)制對象時字段類型不一致,導(dǎo)致賦值不上
當用spring的BeanUtils.copyProperties(obj1, obj2);對象進行復(fù)制時,因為在obj1 類型的對象中定義的屬性類型不同(set方法中用的是Integer類型,get方法中返回的是int類型):
public int getNumber() { return number; } public void setNumber(Integer number) { this.number = number; }
這樣在使用復(fù)制方法時,就不會對這個number屬性進行賦值。這里必須是:
public int getNumber() { return number; } public void setNumber(int number) { this.number = number; }
這里是因為:spring在利用反射復(fù)制對象時,是以javaBean的規(guī)范來使用get/set方法進行設(shè)置值的。同時set方法的參與類型,在classLoader中,也會被計為函數(shù)名的一部分。
所有這里必須都是int類型或者都是integer類型。否則spring就不會對該屬性進行復(fù)制相應(yīng)的值。
第二個知識點:
應(yīng)用場景:當我修改一個工程里的jar包內(nèi)的一個類時(其實改動,就是把上一個知識點里的Integer類型修改成了int類型),然后到去替換服務(wù)器上對應(yīng)的jar包后,重啟工程會出現(xiàn):NoSuchMethodError這樣的錯。
原因是:基本數(shù)據(jù)類型與包裝類型的解包封包是由編譯器提供的(這在jdk 1.5引入)。void setNumber(int a)與 void setNumber(Integer a); 對于編譯器來說是不同的方法,他們的有著不同的方法簽名。
這里就涉及到Java編輯器對Java方法編譯的問題:在Java中,編輯器會把函數(shù)的參數(shù)列表與函數(shù)名稱一起作為內(nèi)存中標記函數(shù)唯一性的標識,這也是Java代碼可以重載的原因。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot2.0 中 HikariCP 數(shù)據(jù)庫連接池原理解析
這篇文章主要介紹了SpringBoot2.0 中 HikariCP 數(shù)據(jù)庫連接池原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01Java修改eclipse中web項目的server部署路徑問題
這篇文章主要介紹了Java修改eclipse中web項目的server部署路徑,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11SpringBoot+MyBatisPlus對Map中Date格式轉(zhuǎn)換處理的方法詳解
在?SpringBoot?項目中,?如何統(tǒng)一?JSON?格式化中的日期格式。本文將為大家介紹一種方法:利用MyBatisPlus實現(xiàn)對Map中Date格式轉(zhuǎn)換處理,需要的可以參考一下2022-10-10詳解IDEA社區(qū)版(Community)和付費版(UItimate)的區(qū)別
這篇文章主要介紹了詳解IDEA社區(qū)版(Community)和付費版(UItimate)的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11