BeanUtils.copyProperties(A,B)使用注意事項


***最近項目中用到BeanUtils.copyProperties(),然后踩了一些坑,也在網上查看了很多同行的測試和總結,現在將自己的測試、整理的注意事項分享如下,希望大家一起學習進步。

***注意:本篇還有很多沒有研究到的地方,如果各位需要使用BeanUtils的功能,還需要根據自身情況多加測試,驗證。任何第三方的工具未經調研、測試和驗證,都是有風險的,你我共勉!



BeanUtils提供對Java反射和自省API的包裝。其主要目的是利用反射機制對JavaBean的屬性進行處理。我們知道,一個JavaBean通常包含了大量的屬性,很多情況下,對JavaBean的處理導致大量get/set代碼堆積,增加了代碼長度和閱讀代碼的難度。

【開宗明義】

1.無論是org.springframework.beans或者org.apache.commons.beanutils,與get/set方式相比,都存在性能問題。

2.效率由高到底:get/set 》PropertyUtils 》BeanUtils。

3.PropertyUtils和BeanUtils兩個工具類都是對bean之間存在屬性名相同的屬性進行處理,無論是源bean或者是目標bean中多出來的屬性均不處理。

4.具體來說:

BeanUtils.copyProperties()可以在一定范圍內進行類型轉換,同時還要注意一些不能轉換時候,會將默認null值轉化成0;

Property.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。

4.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的轉化。說明實際使用過程中,我們還是要多看源碼,多做測試,並且注意版本號升級帶來的微小變化。

【詳細說明】

1、package org.springframework.beans;中的
     BeanUtils.copyProperties(A,B);
     是A中的值付給B

2、package org.apache.commons.beanutils;(常用)

      BeanUtils.copyProperties(A,B);
      是B中的值付給A

具體賦值情況,可以參考兩個包下copyProperties源碼查看。

3.org.apache.commons.beanutils下的BeanUtils支持的類型轉化列表:

* java.lang.BigDecimal   
 
* java.lang.BigInteger   
 
* boolean and java.lang.Boolean   
 
* byte and java.lang.Byte   
 
* char and java.lang.Character   
 
* java.lang.Class   
 
* double and java.lang.Double   
 
* float and java.lang.Float   
 
* int and java.lang.Integer   
 
* long and java.lang.Long   
 
* short and java.lang.Short   
 
* java.lang.String   
 
* java.sql.Date   
 
* java.sql.Time   
 
* java.sql.Timestamp  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM