1原文地址;https://blog.csdn.net/qq_33623197/article/details/79731809
2***最近项目中用到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;(常用)
BeanUtils.copyProperties(A,B);
是B中的值付给A
具体赋值情况,可以参考两个包下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
原文地址:https://www.cnblogs.com/xinglongbing521/p/10145440.html