***最近項目中用到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;(常用)

具體賦值情況,可以參考兩個包下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