BeanUtils.copyProperties 和 PropertyUtils.copyProperties

两个工具类都是对两个bean之前存在name相同的属性进行处理,无论是源bean或者目标bean多出的属性均不处理。

其原理是通过JDK自带的反射机制动态的去get,set,从而去转换我们的类。

但是要注意一点他们所支持的数据类型,还有一个就是假如一个类里面又写了一个类,一般叫做内部类,像这种类进行转换的时候,是不会成功的。

两者最大的区别是: 
1.BeanUtils.copyProperties会进行类型转换,而PropertyUtils.copyProperties不会。 
既然进行了类型转换,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProperties。 
因此,PropertyUtils.copyProperties应用的范围稍为窄一点,它只对名字和类型都一样的属性进行copy,如果名字一样但类型不一样,它会报错。

2.对null的处理:PropertyUtils支持为null的场景;BeanUtils对部分属性不支持null的情况,具体为下:

1)、date类型不支持;
2)、Boolean、Ineger、Long、Short、Float、Double等不支持: 转为false、0;
3)、string:支持,保持null;

使用BeanUtils有几个要注意的地方: 
1.对于类型为Boolean/Short/Integer/Float/Double的属性,它会转换为false、0:

 public class User {  

     private Integer intVal;  

     private Double doubleVal;  

     private Short shortVal;  

     private Long longVal;  

     private Float floatVal;  

     private Byte byteVal;  

     private Boolean booleanVal;
} User src = new User();
User dest = new User();
BeanUtils.copyProperties(dest, src);
System.out.println(src);
System.out.println(dest); //输出结果:
User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null]
User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false]

解释说是因为这几个类型都有对应的基本类型,在进行类型转换时,有可能遇到类似Integer -> int的转换,此时显然不能对int类型的属性赋值为null,因此统一转换为0。

如何让它不要转为0呢?可以这样:

 import org.apache.commons.beanutils.converters.IntegerConverter;  

 IntegerConverter converter = new IntegerConverter(null);    //默认为null,而不是0
BeanUtilsBean beanUtilsBean = new BeanUtilsBean();
beanUtilsBean.getConvertUtils().register(converter, Integer.class);

2.对于java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time这几个类,如果值为null,则在copy时会抛异常,需要使用对应的Conveter:

 public class User2 {  

     private java.util.Date javaUtilDateVal;  

     private java.sql.Date javaSqlDateVal;  

     private java.sql.Timestamp javaSqlTimeStampVal;  

     private BigDecimal bigDecimalVal;  

     private java.sql.Time javaSqlTime;  

 }  

 User2 src = new User2();
User2 dest = new User2(); BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); //如果没有下面几行,则在转换null时会抛异常,例如:org.apache.commons.beanutils.ConversionException: No value specified for 'BigDecimal'
//在org.apache.commons.beanutils.converters这个包下面有很多的Converter,可以按需要使用
beanUtilsBean.getConvertUtils().register(new BigDecimalConverter(null), BigDecimal.class);
beanUtilsBean.getConvertUtils().register(new DateConverter(null), java.util.Date.class); beanUtilsBean.getConvertUtils().register(new SqlTimestampConverter(null), java.sql.Timestamp.class);
beanUtilsBean.getConvertUtils().register(new SqlDateConverter(null), java.sql.Date.class);
beanUtilsBean.getConvertUtils().register(new SqlTimeConverter(null), java.sql.Time.class); beanUtilsBean.copyProperties(dest, src);
System.out.println(src);
System.out.println(dest);

假设是从A复制到B: 
需求1:如果B中某字段有值(不为null),则该字段不复制;也就是B中该字段没值时,才进行复制,适合于对B进行补充值的情况。

 import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.PropertyUtils; public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{ @Override
public void copyProperty(Object bean, String name, Object value)
throws IllegalAccessException, InvocationTargetException {
try {
Object destValue = PropertyUtils.getSimpleProperty(bean, name);
if (destValue == null) {
super.copyProperty(bean, name, value);
}
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
} }

需求2:如果A中某字段没值(为null),则该字段不复制,也就是不要把null复制到B当中。

 import org.apache.commons.beanutils.BeanUtilsBean;  

 public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean {  

     @Override
public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException {
if (value == null) {
return;
}
super.copyProperty(bean, name, value);
}
}

Apache的对象复制详解的更多相关文章

  1. JAVA对象头详解(含32位虚拟机与64位虚拟机)

    为什么要学习Java对象头 学习Java对象头主要是为了解synchronized底层原理,synchronized锁升级过程,Java并发编程等. JAVA对象头 由于Java面向对象的思想,在JV ...

  2. javascript event(事件对象)详解

    javascript event(事件对象)详解   1. 事件对象     1. 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什 ...

  3. 010-Scala单例对象、伴生对象实战详解

    010-Scala单例对象.伴生对象实战详解 Scala单例对象详解 函数的最后一行是返回值 子项目 Scala伴生对象代码实战 object对象的私有成员可以直接被class伴生类访问,但是不可以被 ...

  4. openerp经典收藏 对象定义详解(转载)

    对象定义详解 原文地址:http://shine-it.net/index.php/topic,2159.0.htmlhttp://blog.sina.com.cn/s/blog_57ded94e01 ...

  5. Apache的httpd命令详解

    Apache的httpd命令详解 来源:全栈开发者 发布时间:2012-01-03 阅读次数:10965 4   httpd.exe为Apache HTTP服务器程序.直接执行程序可启动服务器的服务. ...

  6. MySQL异步复制、半同步复制详解

    MySQL数据复制的原理图大致如下: 从上图我们可以看出MySQL数据库的复制需要启动三个线程来实现: 其中1个在主服务器上,另两个在从服务器上.当发出START SLAVE时,从服务器创建一个I/O ...

  7. CorelDRAW中如何复制对象属性详解

    复制对象属性是一种比较特殊.重要的复制方法,它可以方便而快捷地将指定对象中的轮廓笔.轮廓色.填充和文本属性通过复制的方法应用到所选对象中.本教程将详解CorelDRAW中如何复制对象属性. Corel ...

  8. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  9. Apache Spark 内存管理详解(转载)

    Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在梳理出 ...

随机推荐

  1. linux内核分析第二次实验

    http://blog.sina.com.cn/s/blog_78e559950102wnqp.html

  2. FASIC: A Fast-recovery, Adaptively Spanning In-band Control Plane in Software-Defined Network

    2017 IEEE Global Communications Conference 问题:in-band网络中如果物理链路阻塞或者硬件故障,导致控制器的消息不能及时到达各个交换机导致网络不一致甚至某 ...

  3. 云平台项目--学习经验--打包压缩工具requirejs

    requirejs是一个JavaScript模块加载器.适合在浏览器中国使用,也可以在其他脚本环境使用,它鼓励了代码的模块化.使用RequireJS加载模块化脚本将提高代码的加载速度和质量.如何加载R ...

  4. node解决跨域问题

    app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*& ...

  5. Only IPV6 下 使用MSDTC ping 之后 出现 找不到主机的问题

    1. 很奇怪 使用两个虚拟机 进行IPV6测试, 需要验证MSDTC. app的机器名 Win12r2update DB的机器名 Win12r2UpdateDB 2. 在使用ipv4 以及 不进行ho ...

  6. Threadlocal 传递参数(百度二面)

    去百度面试,二面的时候 面试官问 如果我想跟踪一个请求,从接收请求,处理到返回的整个流程,有没有好的办法,后来面试官说了 Threadlocal 可以做到传递参数. 这是ThreadLocal的一个功 ...

  7. Java内置锁synchronized的实现原理

    简述Java中每个对象都可以用来实现一个同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock). 具体表现形式如下: 1.普通同步方法,锁的是当前实例对象 ...

  8. MT【181】横穿四象限

    设函数$f(x)=\dfrac{1}{x-a}-\dfrac{\lambda}{x-2}$,其中$a,\lambda\in R$记$A_1=\{(x,y)|x>0,y>0\},A_2=\{ ...

  9. BZOJ 4380 [POI2015]Myjnie | DP

    链接 BZOJ 4380 题面 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]. 有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个 ...

  10. Problem A: 选举 解题报告

    Problem A: 选举 题意 给出一个投票过程.有\(n\)个选民和\(m\)个候选人,每个选民\(i\)有个不重且有序的可投集合\(\{a_i\}\). 对于第一轮投票,选民\(i\)会投给\( ...