BeanUtils和BeanCopier性能复制Bean工具比较

本文对比了Spring框架中的BeanUtils和BeanCopier对象复制工具,发现BeanCopier在大量数据复制时表现更优,因其基于字节码生成技术,速度更快,但不适用于复杂情况;BeanUtils则灵活通用但效率较低。
摘要由CSDN通过智能技术生成

一、前言

我们本篇比较的是复制Bean对象的工具,分别是org.springframework.beans.BeanUtils和 net.sf.cglib.beans.BeanCopier

二、实验

在这里插入图片描述

import net.sf.cglib.beans.BeanCopier;
import org.springframework.beans.BeanUtils;

Forlan sourceForlan = new Forlan));
Forlan targetForlan = new Forlan();

// BeanCopier复制
BeanCopier copier = BeanCopier.create(sourceForlan.getClass(), targetForlan.getClass(), false);
copier.copy(sourceForlan, targetForlan, null);

// BeanUtils复制
BeanUtils.copyProperties(sourceForlan, targetForlan);

在这里插入图片描述

从上面的结果可以看出:

  • 两者在首次执行都比较,是因为需要进行一些初始化操作
  • 除了10W级别的数据量,BeanCopier稍微慢点,其它量级基本都是它领先

三、原理

1、BeanUtils

BeanUtils的复制原理是基于Java的反射机制。它通过使用反射来获取源对象和目标对象的属性信息,并使用反射来设置目标对象的属性值。

具体而言,BeanUtils会使用反射来获取源对象和目标对象的属性名称和类型。然后,它会通过反射来获取源对象的属性值,并使用反射来设置目标对象的属性值。

在复制过程中,BeanUtils会遍历源对象的属性,并使用反射来获取每个属性的值。然后,它会使用反射来设置目标对象的对应属性的值。
由于BeanUtils使用了反射机制,它的复制过程相对较慢。每次复制都需要通过反射来获取和设置属性值,这会带来一定的性能开销。

2、BeanCopier

BeanUtils的复制原理是基于字节码生成技术。在首次执行时,BeanCopier会通过分析源对象和目标对象的属性,动态生成复制代码,并将其编译成字节码。这种字节码生成的方式避免了使用反射机制,从而提高了复制的性能。

通过生成的字节码,BeanCopier可以直接访问对象的属性,而无需通过反射来获取和设置属性值。这样可以大大减少了方法调用和属性访问的开销,从而提高了复制的速度。

此外,BeanCopier还可能使用一些缓存或优化策略来进一步提高复制的性能。例如,它可以缓存已生成的复制代码,以便在后续的复制操作中直接复用,而无需再次生成。

总的来说,BeanCopier通过使用字节码生成和优化策略,能够在复制过程中实现较高的性能,从而快速地完成对象复制操作。

四、总结

BeanUtils:

  • 缺点:复制过程相对较慢
  • 优点:具有灵活性和通用性,可以处理不同类型的对象和复杂的属性结构。它不需要事先生成复制代码,而是在运行时动态地进行属性的复制操作。

BeanCopier:

  • 优点:速度快
  • 缺点:占用空间,无法处理复杂的情况

总的来说,建议在复制大型Bean对象时优先考虑使用BeanCopier。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Forlan

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值