拷贝相同属性的两个对象的属性-BeanUtils和PropertyUtils以及区别
使用這兩個工具類需要引入的maven jar包依賴
<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.3</version></dependency>beanUtils工具類
使用beanUtils拷貝屬性的實體類需要有以下條件:
1. BeanUtils解析的bean必須被public修飾
2. bean必須提供空參的構(gòu)造器
3. 成員變量必須被private修飾
4. 必須提供set get方法
javaWeb開發(fā)過程中,經(jīng)常需要在領(lǐng)域類之間進(jìn)行實體對象的拷貝操作,比如把Po類的屬性值拷貝給Dto類。
BeanUtils這種工具類應(yīng)用而生,比如org.apache.commons包中的BeanUtils就提供copyProperties(Object dest, Object orig)方法,它方便開發(fā)者快速在倆個對象之間進(jìn)行字段值的拷貝。而且,拷貝條件非常簡單:拷貝實體類之間只要保證字段名稱一樣即可。
盡管BeanUtils好用而且便捷,將開發(fā)者從繁重的get set操作中解放出來,但是筆者不太推薦使用他,原因有三。
1. 字段名必須一樣
雖然倆個拷貝類之間,需要拷貝的屬性字段名必須要一樣,當(dāng)它們字段值不一樣的時候,這時候就需要手動獲取并賦值。當(dāng)倆個實體類存在個別字段不一樣時開發(fā)者容易忽視他,而忘記手動設(shè)置。
比如Po類的用戶名叫 uName(數(shù)據(jù)庫字段u_name),而Dto類因為是給其他模塊調(diào)用的所以寫有閱讀意義的全程userName,這時候我們就必須手動設(shè)置
dtoObj.setUserName(poObj.getuName())。
2. 性能問題
BeanUtils內(nèi)部實現(xiàn)采用的是反射功能,當(dāng)反射的操作數(shù)量達(dá)到萬級別的話,耗時非常明顯。筆者親自試過,對五萬條數(shù)據(jù)進(jìn)行拷貝操作,能明顯感覺到卡頓。所以說BeanUtils是一個用性能換時間的得不償失的買賣。
3. 泛型擦除問題
在進(jìn)行集合直接的數(shù)據(jù)拷貝時,因為泛型擦除問題,導(dǎo)致拷貝失效。比如我們需要將Po集合列表轉(zhuǎn)化為Dto的集合,因為泛型擦除問題,最終得到的還是Po的集合。
BeanUtils.copyProperties()和PropertyUtils.copyProperties()的差別
無論是org.springframework.beans或者org.apache.commons.beanutils,與get/set方式相比,都存在性能問題。
效率由高到底:get/set 》PropertyUtils 》BeanUtils。
PropertyUtils和BeanUtils兩個工具類都是對bean之間存在屬性名相同的屬性進(jìn)行處理,無論是源bean或者是目標(biāo)bean中多出來的屬性均不處理。
具體來說:
BeanUtils.copyProperties()可以在一定范圍內(nèi)進(jìn)行類型轉(zhuǎn)換,同時還要注意一些不能轉(zhuǎn)換時候,會將默認(rèn)null值轉(zhuǎn)化成0;
PropertyUtils.copyProperties()則是嚴(yán)格的類型轉(zhuǎn)化,必須類型和屬性名完全一致才轉(zhuǎn)化。
對于null的處理:PropertyUtils支持為null的場景;BeanUtils對部分屬性不支持null,具體如下:
a. java.util.Date類型不支持,但是它的自雷java.sql.Date是被支持的。java.util.Date直接copy會報異常;
b. Boolean,Integer,Long等不支持,會將null轉(zhuǎn)化為0;
c. String支持,轉(zhuǎn)化后依然為null。
另外:值得注意的是,在測試過程中發(fā)現(xiàn),commons-beanutils-1.8.0.jar版本中的BeanUtils類,支持Byte到Integer或int的轉(zhuǎn)化。說明實際使用過程中,我們還是要多看源碼,多做測試,并且注意版本號升級帶來的微小變化。
總結(jié)
以上是生活随笔為你收集整理的拷贝相同属性的两个对象的属性-BeanUtils和PropertyUtils以及区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 各IT岗位需要的IT职业技能有哪些?
- 下一篇: 曲线拟合函数