BeanUtils.copyProperties到底坑了多少人?

news2024/9/24 3:20:47

今儿我们就来梳理一下BeanUtils.copyProperties的坑点!!

一、坑点全解析

1. 类型不匹配

图片

2. 属性命名差异

例如:

图片

3. Boolean类型和is属性开头的坑

使用Lombok生成的getter方法时,如果Boolean类型的属性以is开头,BeanUtils.copyProperties可能会找不到对应的getter方法,导致拷贝失败。

图片

4. 内部类拷贝问题

对象中包含内部类时,BeanUtils.copyProperties在处理内部类属性时,可能会出现拷贝失败的情况。例如:

 

java

public class Source {
private InnerClass innerClass;
// getters and setters
public static class InnerClass {
private String value;
// getters and setters
}
}

public class Target {
private InnerClass innerClass;
// getters and setters
public static class InnerClass {
private String value;
// getters and setters
}
}

public class InnerClassExample {
public static void main(String[] args) {
Source.InnerClass inner = new Source.InnerClass();
inner.setValue("Inner Value");

Source source = new Source();
source.setInnerClass(inner);

Target target = new Target();
BeanUtils.copyProperties(source, target);

// 这里innerClass的属性不会被正确拷贝
System.out.println("Target inner class value: " + target.getInnerClass().getValue());
}
}

解决方案:手动处理内部类的拷贝,或者使用更智能的映射工具。

二、BeanUtils的隐性问题

1. 引包冲突

BeanUtils在不同的库中有多个实现,比如Apachecommons-beanutilsSpringBeanUtils

使用时需要注意引包,避免冲突。例如:

 

java

import org.springframework.beans.BeanUtils;
// import org.apache.commons.beanutils.BeanUtils; // 避免引入多个BeanUtils

public class PackageConflictExample {
public static void main(String[] args) {
// 代码中可能会因为引包冲突导致意外的错误
}
}

解决方案:明确引入的包,并在项目中统一使用一种BeanUtils实现。

2. 字段引用追踪难题

图片

3. 浅拷贝的限制

BeanUtils.copyProperties只进行浅拷贝,对于对象中的引用类型属性,只拷贝引用不拷贝对象本身,可能导致意外的修改。例如:

图片

解决方案:使用深拷贝工具,或者手动实现深拷贝逻辑。

三、性能瓶颈

为了验证BeanUtils.copyProperties的性能问题,我们可以尝试以下测试:

图片

运行后会发现,BeanUtils.copyProperties在大数据量下的性能较低,可能会成为性能瓶颈。

例如,100万次对象拷贝操作可能需要数秒甚至更长时间,严重影响系统的性能。

四、替代方案

1. 原始get和set方法

手动拷贝属性,虽然繁琐但可控性和直观性更高,这里推荐IDEA的插件:GenerateAllSetter

图片

2. 映射工具库

MapStruct:编译时生成映射代码,性能优越,是目前最主流的工具。

图片

ModelMapper:动态映射,配置灵活。

图片

五、总结

我这些年在工作中最常用的其实就两种:IDEA插件GenerateAllSetter帮助生成set方法,以及前文讲到的Mapstruct

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1915346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP工单预约表单系统小程序源码

🔧【高效办公新利器】工单预约表单系统大揭秘 💼【一键提交,工单管理新高度】 你还在为繁琐的工单提交流程头疼吗?工单预约表单系统,让你的工单管理步入高效时代!只需简单几步,填写必要信息&a…

Qt(四)事件

文章目录 一、概念二、(一)(二)QImage类(三)鼠标事件和键盘事件1. 鼠标事件2. 键盘事件 (四)定时器事件1. 采用定时器事件2. QTimer定时器类 三、 一、概念 事件是由窗口系统或者自…

Java getSuperclass和getGenericSuperclass

1.官方API对这两个方法的介绍 getSuperclass : 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。如果此对象表示一个数组类&#xff…

VSCode升级后不能打开在MacOS系统上

VSCode 在MacOS无法打开 版本 VSCode version: 1.91.0 (x64) 错误信息: MacBook-Pro ~ % /Users/mac/Downloads/FirefoxDownloads/Visual\ Studio\ Code.app/Contents/MacOS/Electron ; exit; [0710/142747.971951:ERROR:crash_report_database_mac.mm(753)] op…

做突破交易时,需要注意的进场细节有哪些?

突破交易揭示了市场未来的走向。 在这种情况下,面对市场时我们应该如何入场操作呢?接下来,让我们来细化一下实施的具体步骤。 01. 在交易中,周期的考量比价格突破更为关键。 当价格突破发生时,市场的平静被打破&#x…

编译执行JAVA含中文字符串文件,终端输出乱码问题处理

Date: 2024.07.10 20:42:07 author: lijianzhan 关于使用JDK21,编译执行JAVA含中文字符串文件,终端输出乱码怎么解决的问题,这篇文章将简单的描述一下问题,解决过程,结果。使用的解决方式是使用IDEA编辑器中的运行调试配置&#…

位运算在数据库中的运用实践-以MySQL和PG为例

目录 前言 一、两种不同的数据库设计 1、状态字段存储JSON 2、使用位运算 二、数据库中的位运算实践 1、MySQL中的位运算实践 2、PostgreSQL中位运算实践 三、总结 前言 最近在解决某用户的一个业务需求时,遇到一个很有意思的场景。首先先跟大家分享一下需求…

ts语法---泛型和泛型约束

泛型 泛型,动态类型,是一个初始化不明确的类型,类似于函数中的形参(不明确参数值), 泛型一般用在function定义函数时动态约束类型,和type定义类型时动态约束类型, 泛型一般使用任…

中小学校园EasyCVR视频综合监管方案:构建安全、智能的校园环境

一、背景需求分析 随着科技的快速发展,校园安全问题日益受到社会各界的关注。尤其是在中小学校园中,学生的安全更是牵动着每一个家庭的心。为了更有效地保障学生的安全,提高校园安全管理水平,视频监控系统在中小学中的应用越来越…

1.10编程基础之简单排序--02:奇数单增序列

OpenJudge - 02:奇数单增序列http://noi.openjudge.cn/ch0110/02/ 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。 输入 共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。 输出 增序输出的奇数序列,数据之间以逗号间隔。数…

华为od100问持续分享-1

我是一名软件开发培训机构老师,我的学生已经有上百人通过了华为OD机试,学生们每次考完试,会把题目拿出来一起交流分享。 重要:2024年5月份开始,考的都是OD统一考试(D卷),题库已经整…

GDidees CMS v3.9.1 本地文件泄露漏洞(CVE-2023-27179)

前言 CVE-2023-27179 是一个影响 GDidees CMS v3.9.1 及更低版本的任意文件下载漏洞。这个漏洞存在于 /_admin/imgdownload.php 文件中,攻击者可以通过向 filename 参数传递恶意输入来下载服务器上的任意文件。 漏洞的根源在于对用户输入的 filename 参数处理不当…

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。 一、 前端界面需要展现多个表的其中几个数据的多表查询。1. 三个表查询其中字段返回:(用一下sql语句&#xff…

scipy库中,不同应用滤波函数的区别,以及FIR滤波器和IIR滤波器的区别

一、在 Python 中,有多种函数可以用于应用 FIR/IIR 滤波器,每个函数的使用场景和特点各不相同。以下是一些常用的 FIR /IIR滤波器应用函数及其区别: from scipy.signal import lfiltery lfilter(fir_coeff, 1.0, x)from scipy.signal impo…

数据结构——约瑟夫环C语言链表实现

约瑟夫环问题由古罗马史学家约瑟夫(Josephus)提出,他参加并记录了公元66—70年犹太人反抗罗马的起义。在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。起义者表示“宁为玉碎不为瓦全”,约瑟夫则想“留得青…

服务器提交记录有Merge branch消除

背景:在共同开发分支release上,你提交了commit,push到服务器上时,发现有人先比你push了,所以你得先pull, 后再push,然而pull后自动产生了一个Merge branch的一个commit,这个commit本…

Floyd算法——AcWing 343. 排序

目录 Floyd算法 定义 运用情况 注意事项 解题思路 基本步骤 AcWing 343. 排序 题目描述 运行代码 代码思路 改进思路 Floyd算法 定义 Floyd算法,全称Floyd-Warshall算法,是一种用于解决图中所有顶点对之间的最短路径问题的动态规划算法。…

配置Java开发环境

Java是一种广泛使用的编程语言,特别是在企业应用和安卓开发中。本文将详细介绍如何在您的计算机上配置Java开发环境,包括安装JDK、配置环境变量以及选择和设置IDE。 一、安装Java Development Kit (JDK) JDK(Java Development Kit&#xff0…

用JavaScript将 NCR(Numeric Character Reference)标记转换为对应字符的方法

0 &#xff0c 、&#11111……是什么鬼&#xff1f; 最近&#xff0c;要将一些网页内容复制到<textarea>文本框中作进一步处理&#xff0c;发现有些网页内容中包含&#xff0c或之类的标记&#xff0c;会被原样复制到<textarea>文本框中。 如果将这些网页内容直…