日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

拷贝相同属性的两个对象的属性-BeanUtils和PropertyUtils以及区别

發布時間:2024/8/1 编程问答 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拷贝相同属性的两个对象的属性-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。

  • BeanUtils的高級功能org.apache.commons.beanutils.Converter接口可以自定義類型轉化,也可以對部分類型數據的null值進行特殊處理,如ConvertUtils.register(new DateConverter(null), java.util.Date.class);但是PropertyUtils沒有。
  • 另外:值得注意的是,在測試過程中發現,commons-beanutils-1.8.0.jar版本中的BeanUtils類,支持Byte到Integer或int的轉化。說明實際使用過程中,我們還是要多看源碼,多做測試,并且注意版本號升級帶來的微小變化。

    總結

    以上是生活随笔為你收集整理的拷贝相同属性的两个对象的属性-BeanUtils和PropertyUtils以及区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。