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 中的一个库,用于对组合约束问题进行建模,包括 约束满足…...
从代购源码到生产环境:反向海淘系统部署与运维实战指南
代码写完之后,真正的考验才刚刚开始。 这是做代购网站开发时经常会遇到的另一个问题——开发的时候感觉一切顺利,一上线就各种出状况。数据库连接数不够、海外用户访问慢、订单高峰期系统卡死……这些问题我在之前的反向海淘项目里都经历过。 这些问题的…...
泉盛UV-K5/K6对讲机专业级固件定制与功能扩展指南
泉盛UV-K5/K6对讲机专业级固件定制与功能扩展指南 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 泉盛UV-K5/K6对讲机LOSEHU固件是一款基于多个开…...
Gemini3.1Pro:自回归与扩散模型的路线之争
扩散语言模型与传统自回归:Gemini 3.1 Pro 的路线选择怎么理解?过去很长一段时间,大模型主流架构基本都围绕“传统自回归(Autoregressive)”展开:一次生成一个 token,靠注意力把上下文信息逐步融…...
Android 指纹浏览器开发教程三:WebView、Chromium 和壳层方案怎么选
导语 Android 指纹浏览器项目走到第三步,往往要面对第一个“分叉路口”:到底用系统 WebView、自编译 Chromium,还是在现有内核外面再套一层壳? 以 EasyBR 指纹浏览器为例,更关键的不是单点参数,而是整条配置…...
3步终极解决方案:如何专业卸载Windows 10/11的Microsoft Edge浏览器
3步终极解决方案:如何专业卸载Windows 10/11的Microsoft Edge浏览器 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemo…...
UE5.4.4视频不导入实战:绕过Content Browser直连文件系统
1. 为什么在UE5.4.4里“不导入视频”反而成了刚需?在UE5.4.4项目现场,我最近连续被三个不同团队问到同一个问题:“能不能别把视频拖进Content Browser?”——不是他们不会操作,而是一拖进去就出事。美术同事导了个2.7G…...
LoRA微调、DINOv2视觉基础模型与CLIP驱动编辑实战指南
1. 项目概述:这不是一份新闻简报,而是一份AI领域从业者的“十月实战观测手记”2021年10月,AI圈没有爆炸性突破,但有一股沉潜的力量在积蓄——模型能力正从“能跑通”加速转向“敢落地”。我翻遍当月所有主流技术博客、会议预印本、…...
5分钟掌握Pandoc:终极文档格式转换神器完全指南
5分钟掌握Pandoc:终极文档格式转换神器完全指南 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 你是否曾经为文档格式转换而烦恼?需要将Markdown转换为Word,或者将HTML转换…...
2026年企业直播平台怎么选?选型清单与避坑指南
选企业直播平台,99%的企业会踩这5个坑:首年低价续费涨价、CDN质量差导致直播卡顿、功能演示≠实际能力、售后响应慢、数据安全隐患。 本文整理了企业直播平台选型7维度、5大常见坑、5个典型场景的建议,以及一份可直接使用的选型检查清单。 …...
5步终极指南:如何永久免费使用Cursor Pro AI编程助手
5步终极指南:如何永久免费使用Cursor Pro AI编程助手 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...
