有关java对象拷贝操作的总结

本文详细介绍了Java中对象拷贝的各种方式,包括手动get&set、Cglib的BeanCopier、Apache的BeanUtils、PropertyUtils以及Spring的BeanUtils。对比了它们之间的性能和区别,指出Cglib BeanCopier在性能上表现优秀。此外,文章讨论了浅拷贝和深拷贝的概念,解释了默认赋值操作为浅拷贝,并提供了实现深拷贝的两种方法:实现Cloneable接口和使用序列化。通过代码示例展示了这两种深拷贝的实现方式。

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

一、引言

常用的拷贝方式:

  1. 手动get&set实现。
  2. 通过Cglib的BeanCopier实现。
  3. 通过Apache的BeanUtils实现。
  4. 通过Apache的PropertyUtils实现。
  5. 通过Spring的BeanUtils实现。

(此模块先对常用拷贝方式进行总结,后文会详细介绍深拷贝&浅拷贝的区别以及实现方式。)

二.常用拷贝方式之间的区别

1. 手动get&set实现:

简单,粗暴,高性能

2. 通过CglibBeanCopier实现(使用动态代理,效率高):

不使用类型转换器:

BeanCopier beanCopier = BeanCopier.create(SourceClass.class, TargetClass.class, false); 前赋后

beanCopier.copy(sourceClass, targetClass, null);

不支持不同类型字段的转换,但可通过自己实现的converter转换器实现类型之间的转换。

使用类型转换器:

BeanCopier beanCopier = BeanCopier.create(SourceClass.class, TargetClass.class, true); 前赋后

beanCopier.copy(sourceClass, targetClass, converter); //converter为自己实现的转换器。

例如:

public class Long2StringConvert implements Converter {

    @Override
    public Object convert(Object sourceValue, Class targetClass, Object methodName) {
        if( null != sourceValue && sourceValue.getClass().equals(Long.class) && targetClass.equals(String.class)) {
            return String.valueOf(sourceValue);
        }
        return sourceValue;
    }
}

生成用于复制两个类的BeanCoper类:

public final static BeanCopier dir2DirVOCopier = BeanCopier.create(Dir.class,DirVO.class,true);

执行拷贝:

BeanCopyProvider.dir2DirVOCopier.copy(dir, vo, new Long2StringConvert());

参考文档:

CGLIB中BeanCopier源码实现 - 简书 // CGLIB中BeanCopier源码实现

对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀(1)------功能简介_express_wind的专栏-CSDN博客

对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀(2)------缺陷预防_express_wind的专栏-CSDN博客

对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀(3)------优化方案_express_wind的专栏-CSDN博客_beancopier和beanutils

3. 通过Apache的BeanUtils实现(反射机制):

使用:BeanUtils.copyProperties(targetClass, sourceClass);  后赋前

提供自动转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换

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

* fl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值