• 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

    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  

  • 相关阅读:
    ASP.NET WebApi 文档Swagger中度优化
    ASP.NET五步打包下载Zip文件
    JavaScript——HashMap实现
    JS实现集合和ECMA6集合
    JavaScript——双向链表实现
    用JavaScript来实现链表LinkedList
    JavaScript结构三层——思想快速介绍
    浏览器自动刷新——基于Nodejs的Gulp LiveReload与VisualStudio完美结合。
    JavaScript原型OOP——你上车了吗?
    再谈JavaScript闭包及应用
  • 原文地址:https://www.cnblogs.com/xinglongbing521/p/10145440.html
Copyright © 2020-2023  润新知