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