一、 经过反射将一个对象的值赋值个另一个对象(前提是对象中属性的名字相同)。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没有。