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没有。 
相关文章
相关标签/搜索