BeanUtils.copyProperties(A,B)使用注意事项

***最近项目中用到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
  
FinCpDocDO  finCpDoc = finCpDocService.selectByDocNo(orderNo);
FinCpDocDto finCpDto = new FinCpDocDto();
if (finCpDoc == null){
   throw new ServiceException("查无该订单" + "orderNo:" + orderNo);
}
try{
   BeanUtils.copyProperties(finCpDoc, finCpDto);
2、package org.apache.commons.beanutils;(常用)
      BeanUtils.copyProperties(A,B);
      是B中的值付给A
for(OboFeeDO feeDO : oboFeeList){
    if(feeDO.getPayTime()!=null){
        ErpOboFeeDto feeDto = new ErpOboFeeDto();
        BeanUtils.copyProperties(feeDto, feeDO);
        oboFeList.add(feeDto);
    }
}

具体赋值情况,可以参考两个包下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  

 

你可能感兴趣的:(BeanUtils.copyProperties(A,B)使用注意事项)