BeanUtils.copyProperties VS PropertyUtils.copyProperties

一、 經過反射將一個對象的值賦值個另一個對象(前提是對象中屬性的名字相同)。java

二、 BeanUtils.copyProperties(obj1,obj2); 常常鬧混不知道是誰給誰賦值,無心中先到"後付前"這個詞來幫助本身記憶這個功能。即將obj2的值賦值給obj1。sql

三、 若是2中實例obj2爲空對象,即值new了他的實例並無賦值的話obj1對應的屬性值也會被設置爲空置。apache

四、BeanUtils與PropertyUtils對比(這裏對比copyProperties方法)工具

PropertyUtils的copyProperties()方法幾乎與BeanUtils.copyProperties()相同,主要的區別在於後者提供類型轉換功能,即發現兩個JavaBean的同名屬性爲不一樣類型時,在支持的數據類型範圍內進行轉換,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對象

 

不支持java.util.Date轉換,但支持java.sql.Date。若是開發中Date類型採用util而非sql.Date程序會拋出argument mistype異常。blog

做爲兩個bean屬性copy的工具類,他們被普遍使用,同時也很容易誤用,給人形成困然;好比:昨天發現同事在使用BeanUtils.copyProperties copy有integer類型屬性的bean時,沒有考慮到會將null轉換爲0,然後面的業務依賴於null來判斷,致使業務出錯。下面總結一下主要的注意點:接口

  • 大範圍兩個工具類都是對兩個bean以前存在name相同的屬性進行處理,不管是源bean或者目標bean多出的屬性均不處理。ci

  • 具體到BeanUtils是相同name而且類型之間支持轉換的屬性能夠處理,而PropertyUtils不支持類型轉換必須是類型和name同樣才處理。

  • 對null的處理:PropertyUtils支持爲null的場景;BeanUtils對部分屬性不支持null的狀況,具體爲下:

        1)、date類型不支持:異常 dateorg.apache.commons.beanutils.ConversionException: No value                  

          specified for 'Date'     

        2)、Ineger、Boolean、Long等不支持: 轉爲0;     

        3)、string:支持,保持null;

  • 關於類型轉換的例子:     

       源bean有屬性:   private Long    dateVal;

       目標bean有屬性:private Date    dateVal;

       使用 PropertyUtils,會保錯:Caused by: java.lang.IllegalArgumentException: argument type mismatch

       使用BeanUtils,則至關於new date(dateVal),網上傳言java.util.Date不支持,就測試來講不管是 sql    

       util 都是ok

  • 對於自定義的對象類型屬性  都是淺copy :

       好比都有屬性:private Base  base;   Base有一個屬性String Test;

       new.getBase().setTest("new");

       那麼old.getBase().getTest()也爲new

  • 性能:get,set《PropertyUtils《BeanUtils
  • BeanUtils的高級功能org.apache.commons.beanutils.Converter接口能夠自定義類型之間的轉化。PropertyUtils沒有。 
相關文章
相關標籤/搜索