BeanUtils.copyProperties VS PropertyUtils.copyProperties

本文对比了BeanUtils与PropertyUtils在属性复制方面的差异,包括它们对不同类型属性的支持情况、对null值的处理方式及性能表现。此外还讨论了自定义对象类型的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 BeanUtils.copyProperties VS  PropertyUtils.copyProperties 

作为两个bean属性copy的工具类,他们被广泛使用,同时也很容易误用,给人造成困然;比如:昨天发现同事在使用BeanUtils.copyProperties copy有integer类型属性的bean时,没有考虑到会将null转换为0,而后面的业务依赖于null来判断,导致业务出错。下面总结一下主要的注意点:

 

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


  • 具体到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没有。 

 

BeanUtils.copyProperties() 是 Java 中用于简化对象属性复制操作的工具方法,常用于 JavaBean 对象之间的属性赋值。它属于 Apache Commons BeanUtils 或 Spring 框架中的类库,能够自动识别源对象和目标对象中同名的属性并进行赋值,从而避免大量手动编写的 getter/setter 操作。 ### 使用方式 在 Spring 框架中,BeanUtils.copyProperties() 的基本使用形式如下: ```java org.springframework.beans.BeanUtils.copyProperties(target, source); ``` 其中 `target` 是目标对象,`source` 是源对象。该方法会将 `source` 中与 `target` 同名的属性值复制到 `target` 中 [^4]。 例如,定义两个类: ```java @Data class Person { private String name; private Integer age; } @Test public void testBeanUtils() { Person source = new Person("张三", 25); Person target = new Person(); BeanUtils.copyProperties(target, source); System.out.println(target.getName()); // 输出:张三 System.out.println(target.getAge()); // 输出:25 } ``` ### 类型转换支持 BeanUtils.copyProperties() 在处理属性复制时,不会自动进行类型转换。如果源对象和目标对象中存在同名但不同类型的属性,BeanUtils 会忽略该属性的复制操作 [^3]。例如,如果源对象中的属性是 `String` 类型,而目标对象中是 `Integer` 类型,则不会进行转换。 相比之下,PropertyUtils.copyProperties() 支持在一定范围内的类型转换,例如将 `String` 转换为 `Integer`,但其性能略低于 BeanUtils.copyProperties() [^1]。 ### 常见问题 1. **集合类型复制问题** BeanUtils.copyProperties() 无法直接处理集合类型(如 List、Set)。需要遍历集合元素,逐个复制每个对象: ```java List<Person> sourceList = ...; List<Person> targetList = new ArrayList<>(); for (Person person : sourceList) { Person target = new Person(); BeanUtils.copyProperties(target, person); targetList.add(target); } ``` 2. **类型不一致导致的属性忽略** 如果两个对象中存在同名但类型不同的属性,BeanUtils 会跳过该属性的复制,不会抛出异常,容易导致数据丢失 [^3]。 3. **性能问题** 由于 BeanUtils 使用了反射机制,其性能通常低于手动编写的 setter/getter 操作。在对性能敏感的场景下,建议使用 MapStruct 或 Dozer 等更高效的对象映射工具。 4. **字段名称不一致或嵌套对象处理** BeanUtils.copyProperties() 仅支持字段名称完全一致的情况,对于字段名不一致或嵌套对象的映射,需要额外处理,例如自定义转换逻辑或使用更高级的映射工具。 ### 与其他工具对比 - **Hutool 的 BeanUtil.copyProperties()** Hutool 提供的 BeanUtil.copyProperties() 在处理类型不一致的属性时更加宽容,不会直接跳过,而是尝试进行转换 [^3]。 - **MapStruct** MapStruct 是一个基于注解处理器的代码生成工具,能够在编译期生成映射代码,性能远高于反射方式,适合大规模数据对象映射。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值