Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作
在Java编程中,BeanUtil工具类是一种强大且便捷的工具,用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能,通过详细的代码示例展示其应用,并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用场景,帮助开发者更好地理解和应用这一工具类。
一、BeanUtil 工具类介绍
1. BeanUtil 简述
BeanUtil是一个广泛使用的Java工具类,提供了一系列方法来简化JavaBean对象之间的属性复制和操作。它主要用于解决复杂的对象操作和属性处理问题,显著提高代码的可读性和维护性。
BeanUtils是浅拷贝,对基本数据类型进行值传递,对引用数据类型,使用其引用地址,不拷贝其内容。与之对应的是深拷贝,深拷贝是对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。
2. BeanUtil 功能
BeanUtil的核心功能包括:
- 属性复制:将一个对象的属性复制到另一个对象中。
- 属性设置和获取:动态地设置和获取对象的属性值。
- 类型转换:支持基本类型和包装类型之间的转换。
以下是BeanUtil的一些常用功能及其描述:
功能 | 描述 |
---|---|
copyProperties | 将一个对象的属性值复制到另一个对象中 |
setProperty | 设置对象的指定属性值 |
getProperty | 获取对象的指定属性值 |
cloneBean | 克隆一个对象,生成其副本 |
populate | 使用Map数据填充对象的属性 |
describe | 将对象的属性和值转换为Map |
3. 与同类对象/属性操作库的对比
除了BeanUtil,还有许多类似的工具类和库可以实现对象属性复制和操作。
以下是一些常见的同类工具:
-
Apache Commons BeanUtils:
- 提供了一系列用于操作JavaBean的实用工具方法,包括属性复制、属性设置和获取等。它是一个开源库,广泛用于Java项目中。
-
Spring BeanUtils:
- 由Spring Framework提供的工具类,提供了简单的属性复制和操作方法。它在Spring应用程序中非常常见,特别适用于Spring生态系统内的项目。
-
Dozer:
- 一个Java Bean到Java Bean的映射器,支持深度复制和复杂的映射需求。它允许自定义映射配置,适用于需要进行复杂对象转换的场景。
-
ModelMapper:
- 一种智能的对象映射框架,旨在简化对象之间的映射。它提供了强大的映射功能,能够处理复杂的对象关系和类型转换。
-
MapStruct:
- 一种编译时代码生成器,自动生成类型安全、高性能的Bean映射代码。它通过注解驱动的方式定义映射关系,减少运行时的开销。
-
Orika:
- 一个Java Bean映射器,专注于提供快速且简单的对象映射功能。它支持复杂的映射配置和多种映射策略,适用于需要高性能映射的项目。
下表对这些工具类的主要功能进行对比:
工具类 | 属性复制 | 属性设置和获取 | 类型转换 | 性能 | 配置复杂度 |
---|---|---|---|---|---|
BeanUtil | 是 | 是 | 是 | 中等 | 低 |
Apache BeanUtils | 是 | 是 | 是 | 低 | 低 |
Spring BeanUtils | 是 | 是 | 否 | 高 | 低 |
Dozer | 是 | 否 | 是 | 低 | 中等 |
ModelMapper | 是 | 否 | 是 | 中等 | 中等 |
MapStruct | 是 | 否 | 是 | 高 | 高 |
Orika | 是 | 否 | 是 | 中等 | 中等 |
这些工具类和库各有特点,开发者可以根据项目需求选择最合适的工具。例如,Apache Commons BeanUtils和Spring BeanUtils适合简单的属性复制,而Dozer和ModelMapper则适合处理复杂的对象映射和转换需求。MapStruct和Orika则在性能和类型安全方面表现出色。
二、BeanUtil 工具类使用示例
1. 属性复制
属性复制是BeanUtil最常用的功能之一,可以将一个对象的所有属性值复制到另一个对象中。
+-------------------+ BeanUtil +-------------------+
| Source Object | -------------->| Target Object |
|-------------------| 复制属性 |-------------------|
| name: "John" | | name: "John" |
| age: 30 | | age: 30 |
+-------------------+ +-------------------+
以下是示例代码:
import org.apache.commons.beanutils.BeanUtils;public class BeanUtilExample {public static void main(String[] args) {try {SourceObject source = new SourceObject("John", 30);TargetObject target = new TargetObject();BeanUtils.copyProperties(target, source);System.out.println("Target Object: " + target);} catch (Exception e) {e.printStackTrace();}}
}class SourceObject {private String name;private int age;public SourceObject(String name, int age) {this.name = name;this.age = age;}// getters and setters
}class TargetObject {private String name;private int age;@Overridepublic String toString() {return "TargetObject [name=" + name + ", age=" + age + "]";}// getters and setters
}
在这个示例中,copyProperties
方法将source
对象的属性值复制到target
对象中。
2. 属性设置和获取
BeanUtil还提供了动态设置和获取对象属性的方法。
以下是示例代码:
import org.apache.commons.beanutils.BeanUtils;public class PropertyExample {public static void main(String[] args) {try {MyBean myBean = new MyBean();BeanUtils.setProperty(myBean, "name", "Alice");BeanUtils.setProperty(myBean, "age", 25);String name = BeanUtils.getProperty(myBean, "name");String age = BeanUtils.getProperty(myBean, "age");System.out.println("Name: " + name);System.out.println("Age: " + age);} catch (Exception e) {e.printStackTrace();}}
}class MyBean {private String name;private int age;// getters and setters
}
3. 对象克隆
BeanUtil还可以克隆对象,生成其副本。
以下是示例代码:
import org.apache.commons.beanutils.BeanUtils;public class CloneExample {public static void main(String[] args) {try {MyBean original = new MyBean("Bob", 40);MyBean clone = (MyBean) BeanUtils.cloneBean(original);System.out.println("Original: " + original);System.out.println("Clone: " + clone);} catch (Exception e) {e.printStackTrace();}}
}class MyBean {private String name;private int age;public MyBean() {}public MyBean(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "MyBean [name=" + name + ", age=" + age + "]";}// getters and setters
}
在这个示例中,cloneBean
方法创建了original
对象的一个副本。
三、BeanUtil 工具类总结
BeanUtil工具类为Java开发者提供了一种简便的方法来操作JavaBean对象的属性。通过使用BeanUtil,开发者可以减少重复代码,提高开发效率,增强代码的可读性和可维护性。尽管有许多类似的工具类和库,BeanUtil凭借其简单易用和强大的功能,仍然是许多项目中的首选。选择合适的工具类应根据项目的具体需求和复杂度来决定。对于简单的属性复制和操作,BeanUtil无疑是一个优秀的选择。而对于复杂的映射需求,可能需要考虑使用其他更为强大的映射工具。希望本文通过详细的介绍和示例代码,能够帮助开发者更好地理解和应用BeanUtil工具类,提高开发效率和代码质量。
相关文章:

Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作
在Java编程中,BeanUtil工具类是一种强大且便捷的工具,用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能,通过详细的代码示例展示其应用,并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用…...

【ES6】ECMAS6新特性概览(一):变量声明let与const、箭头函数、模板字面量全面解析
🔥 个人主页:空白诗 🔥 热门专栏:【JavaScript】 文章目录 🌿 引言一、 let 和 const - 变量声明的新方式 🌟📌 var的问题回顾📌 let的革新📌 const的不变之美 二、 Arro…...

刷题之从前序遍历与中序遍历序列构造二叉树(leetcode)
从前序遍历与中序遍历序列构造二叉树 前序遍历:中左右 中序遍历:左中右 前序遍历的第一个数必定为根节点,再到中序遍历中找到该数,数的左边是左子树,右边是右子树,进行递归即可。 #include<vector>…...

微信小程序--微信开发者工具使用小技巧(3)
一、微信开发者工具使用小技巧 1、快速创建小程序页面 在app.json中的pages配置项,把需要创建的页面填写上去 2、快捷键使用 进入方式 1: 文件–>首选项–> keyboard shortcuts 进入快捷键查看与设置 进入方式 2: 设置–>快捷键…...
JDBC的 PreparedStatement 的用法和解释
文章目录 前言1、封装数据库连接和关闭操作数据库配置文件 config.properties 2、批量添加操作3、查询操作4、修改和删除操作总结 前言 PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 1、封装数据库连接和关闭操作 package org.springblade.m…...
LeetCode 面试150
最近准备面试,我以前不愿意面对的 现在保持一颗本心,就是专注于算法思想,语言基础的磨炼; 不为速成,不急功近利的想要比赛,或者为了面试。 单纯的本心,体验算法带来的快乐,是一件非常…...
xmake+xrepo自建仓库添加交叉编译工具链
xmakexrepo自建仓库添加交叉编译工具链 最近想将交叉编译工具链放到xrepo自建仓库中,在xmake中引用,方便多个电脑快速实现交叉编译。 xmake官方文档感觉不够详细,折腾了好久,这里做个记录。 基本步骤如下: 添加自建…...

论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023
《论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023 前言 简介研究现状任务定义模型架构Learning to know myselfLearning to avoid Misidentification损失函数实验结果消融实验 前言 亲身阅读感受分享,细节画图解释…...

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …...
MyBatis懒加载数据(大批量数据处理)
使用范例 Cursor约定使用Iterator去懒加载数据,以时间换空间,非常适合处理通常无法容纳在内存中的数百万个项目查询。如果在 resultMap 中使用集合,则必须使用 resultMap 的 id 列对游标 SQL 查询进行排序(resultOrdered“true”)。 //为了避…...

MySQL--联合索引应用细节应用规范
目录 一、索引覆盖 1.完全覆盖 2.部分覆盖 3.不覆盖索引-where条件不包含联合索引的最左则不覆盖 二、MySQL8.0在索引中的新特性 1.不可见索引 2.倒序索引 三、索引自优化--索引的索引 四、Change Buffer 五、优化器算法 1.查询优化器算法 2.设置算法 3.索引下推 …...

【spring boot+Lazy ORM+mysql】开发一个数据库管理系统实现对应数据库数据查看和修改
【spring bootLazy ORMmysql】开发一个数据库管理系统实现对应数据库数据查看和修改 演示项目地址:http://124.222.48.62:30193/wu-smart-acw-ui/index.html#/login (admin/admin) 功能 用户登录注册新增、编辑数实例新增、编辑数据库信息…...

知识分享:隔多久查询一次网贷大数据信用报告比较好?
随着互联网金融的快速发展,越来越多的人开始接触和使用网络贷款。而在这个过程中,网贷大数据信用报告成为了评估借款人信用状况的重要依据。那么,隔多久查询一次网贷大数据信用报告比较好呢?接下来随小易大数据平台小编去看看吧。 首先&…...

【Day8:JAVA字符串的学习】
目录 1、常用API2、String类2.1 String类的特点2.2 String类的常见构造方法2.3 String类的常见面试题:2.3.1 面试题一:2.3.2 面试题二:2.3.3 面试题三:2.3.4 面试题四: 2.4 String类字符串用于比较的方法2.5 String类字…...

jetcache缓存
1 介绍 是阿里的双极缓存,jvm-->redis-->数据库 文档:jetcache/docs/CN at master alibaba/jetcache GitHub 2 注意事项 使用的实体类一定实现序列化接口定时刷新注解,慎用 它会为每一个key创建一个定时器 :场景为&…...
SQLSyntaxErrorException: FUNCTION dbname.to_timestamp does not exist
由于MySQL数据库高版本(如8.x)中有to_timestamp()函数,低版本中(如5.7.x)没有这个函数,服务运行报错。 自己创建函数实现功能,创建语句如下; DELIMITER // CREATE FUN…...
Borel-Cantelli 引理
翻译自大佬 https://huarui1998.com/Notes/math/borel-cantelli.html 1. 集序列的 lim inf \lim\inf liminf 和 lim sup \lim\sup limsup 类似于定义实数序列 { a k } \{a_k\} {ak} 的 lim inf \lim\inf liminf 和 lim sup \lim\sup limsup, …...
算法训练营第四十一天 | LeetCode 509 斐波那契数列、LeetCode 70 爬楼梯、LeetCode 746 使用最小花费爬楼梯
LeetCode 509 斐波那契数列 这题动规五部曲都定义得比较明确。首先是dp数组下标,题目中给定F(0) 0说明从0开始,dp[i]直接表示F(i)的值即可。递推公式也直接给出了,也给了开头两个作为递推基础的数值作为初始化依据。遍历顺序也指明是从前往…...

网络其他重要协议(DNS、ICMP、NAT)
1.DNS DNS是一整套从域名映射到IP的系统 1.1 DNS背景 TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,例如我们想访问百度就会在浏览器中输入baidu.com而不是百度的IP地址。于是人们发明了一种叫主机名的东西, 是…...
利用PyCSP3库(含大量全局约束)进行组合约束建模
文章目录 1. 什么是 PyCSP3 ?2. 安装方法(Windows)2.1 通过 Google_colab 直接运行2.2 通过 pip 进行安装3. 快速入门3.1 声明变量3.2 更新约束3.3 定义目标3.4 常用的全局约束1. 什么是 PyCSP3 ? PyCSP3 是 Python 中的一个库,用于对组合约束问题进行建模,包括 约束满足…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...