【Java 进阶篇】Java BeanUtils 使用详解

Java中的BeanUtils是一组用于操作JavaBean的工具,它允许你在不了解JavaBean的具体内部结构的情况下,访问和修改其属性。本文将详细介绍Java BeanUtils的使用,包括如何获取和设置JavaBean的属性,复制属性,以及如何处理嵌套属性和集合属性。
什么是JavaBean
在开始之前,让我们先了解一下什么是JavaBean。JavaBean是一种特殊的Java类,它遵循一组命名规范和编程约定,通常用于存储数据。JavaBean的特点包括:
- 具有无参数的公共构造函数。
- 属性由公共的setter和getter方法管理。
- 可序列化,可以用于持久化和网络传输。
- 遵循一些命名规范,如属性的getter方法应该以"get"或"is"开头,setter方法以"set"开头。
以下是一个简单的JavaBean示例:
public class Person {private String name;private int age;public Person() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
在上面的示例中,Person类是一个典型的JavaBean,它有两个属性(name和age),每个属性都有对应的setter和getter方法。
添加BeanUtils库
要使用BeanUtils,你需要添加相关的库依赖。BeanUtils通常使用Apache Commons BeanUtils库。你可以在Maven项目中的pom.xml文件中添加以下依赖:
<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version>
</dependency>
在Gradle项目中,你可以在build.gradle文件中添加以下依赖:
implementation 'commons-beanutils:commons-beanutils:1.9.4'
获取和设置属性值
获取属性值
BeanUtils提供了一种简单的方式来获取JavaBean的属性值。你可以使用PropertyUtils类的getProperty方法来获取属性的值。
以下是如何获取Person对象的name属性的值:
import org.apache.commons.beanutils.PropertyUtils;public class Main {public static void main(String[] args) throws Exception {Person person = new Person();person.setName("Alice");String name = (String) PropertyUtils.getProperty(person, "name");System.out.println("Name: " + name);}
}
在上面的代码中,我们创建了一个Person对象,然后使用PropertyUtils.getProperty方法来获取name属性的值。
设置属性值
BeanUtils还允许你设置JavaBean的属性值。你可以使用PropertyUtils类的setProperty方法来设置属性的值。
以下是如何设置Person对象的age属性的值:
import org.apache.commons.beanutils.PropertyUtils;public class Main {public static void main(String[] args) throws Exception {Person person = new Person();PropertyUtils.setProperty(person, "age", 30);System.out.println("Age: " + person.getAge());}
}
在上面的代码中,我们使用PropertyUtils.setProperty方法将age属性的值设置为30。
复制属性
BeanUtils还提供了复制属性的功能,允许你从一个JavaBean复制属性值到另一个JavaBean。这在对象之间的数据传递和转换时非常有用。
复制所有属性
要复制一个JavaBean的所有属性到另一个JavaBean,你可以使用BeanUtils类的copyProperties方法。
以下是一个示例,将一个Person对象的属性复制到另一个Person对象:
import org.apache.commons.beanutils.BeanUtils;public class Main {public static void main(String[] args) throws Exception {Person source = Person();source.setName("Alice");source.setAge(25);Person destination = new Person();BeanUtils.copyProperties(destination, source);System.out.println("Destination Name: " + destination.getName());System.out.println("Destination Age: " + destination.getAge());}
}
在上面的示例中,我们创建了两个Person对象,然后使用BeanUtils.copyProperties方法将source对象的属性复制到destination对象。最终,destination对象的属性与source对象相同。
复制指定属性
如果你只想复制JavaBean的部分属性,可以使用PropertyUtils类的copyProperty方法。
以下是一个示例,只复制Person对象的name属性:
import org.apache.commons.beanutils.PropertyUtils;public class Main {public static void main(String[] args) throws Exception {Person source = new Person();source.setName("Alice");Person destination = new Person();PropertyUtils.copyProperty(destination, "name", source.getName());System.out.println("Destination Name: " + destination.getName());}
}
在上面的示例中,我们使用PropertyUtils.copyProperty方法只复制name属性的值。
处理嵌套属性
有时,JavaBean中的属性可以是其他JavaBean对象。BeanUtils允许你处理嵌套属性,即在一个JavaBean中的属性是另一个JavaBean对象。
获取嵌套属性
要获取嵌套属性的值,你可以使用点号.来访问属性的子属性。
假设Person类有一个Address属性:
public class Person {private String name;private Address address;// 省略其他代码
}
你可以使用以下方式获取Person对象的address属性的street属性的值:
import org.apache.commons.beanutils.PropertyUtils;public class Main {public static void main(String[] args) throws Exception {Person person = new Person();Address address = new Address();address.setStreet("123 Main St");person.setAddress(address);String street = (String) PropertyUtils.getProperty(person, "address.street");System.out.println("Street: " + street);}
}
在上面的示例中,我们使用点号.来访问address属性的street属性。
设置嵌套属性
要设置嵌套属性的值,你可以使用点号.来设置属性的子属性。
继续上面的示例,我们可以设置Person对象的address属性的street属性的值:
import org.apache.commons.beanutils.PropertyUtils;public class Main {public static void main(String[] args) throws Exception {Person person = new Person();Address address = new Address();PropertyUtils.setProperty(person, "address.street", "456 Elm St");System.out.println("Street: " + person.getAddress().getStreet());}
}
在上面的示例中,我们使用点号.来设置address属性的street属性的值。
处理集合属性
有时,JavaBean中的属性可以是集合类型,如List、Set或Map。BeanUtils允许你处理集合属性,即在一个JavaBean中的属性是集合。
获取集合属性
要获取集合属性的值,你可以使用方括号[]来访问集合中的元素。如果属性是一个List或数组,可以使用索引;如果属性是一个Map,可以使用键。
假设Person类有一个hobbies属性,它是一个List:
public class Person {private List<String> hobbies;// 省略其他代码
}
你可以使用以下方式获取Person对象的hobbies属性的第一个元素:
import org.apache.commons.beanutils.PropertyUtils;public class Main {public static void main(String[] args) throws Exception {Person person = new Person();List<String> hobbies = new ArrayList<>();hobbies.add("Reading");hobbies.add("Traveling");person.setHobbies(hobbies);String firstHobby = (String) PropertyUtils.getProperty(person, "hobbies[0]");System.out.println("First Hobby: " + firstHobby);}
}
在上面的示例中,我们使用方括号[]来访问hobbies属性的第一个元素。
设置集合属性
要设置集合属性的值,也可以使用方括号[]来设置集合中的元素。
继续上面的示例,我们可以设置Person对象的hobbies属性的第一个元素:
import org.apache.commons.beanutils.PropertyUtils;public class Main {public static void main(String[] args) throws Exception {Person person = new Person();List<String> hobbies = new ArrayList<>();hobbies.add("Reading");hobbies.add("Traveling");person.setHobbies(hobbies);PropertyUtils.setProperty(person, "hobbies[0]", "Cooking");System.out.println("First Hobby: " + person.getHobbies().get(0));}
}
在上面的示例中,我们使用方括号[]来设置hobbies属性的第一个元素。
总结
Java BeanUtils是一个强大的工具,允许你在不了解JavaBean的内部结构的情况下,访问和修改其属性。你可以使用BeanUtils来获取和设置属性值,复制属性,处理嵌套属性和集合属性。这使得在Java应用程序中处理对象之间的数据传递和转换变得更加容易。
希望本文对你理解Java BeanUtils的使用提供了帮助。继续探索和学习,你会发现BeanUtils在开发过程中的许多场景中都是非常有用的工具。
如果你想深入学习Java BeanUtils,可以查阅官方文档和示例代码,进一步了解其功能和用法。祝你在Java开发中取得成功!
| 作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |
相关文章:
【Java 进阶篇】Java BeanUtils 使用详解
Java中的BeanUtils是一组用于操作JavaBean的工具,它允许你在不了解JavaBean的具体内部结构的情况下,访问和修改其属性。本文将详细介绍Java BeanUtils的使用,包括如何获取和设置JavaBean的属性,复制属性,以及如何处理嵌…...
YugaByteDB -- 全新的 “PostgreSQL“ 存储层
文章目录 0 背景1 架构1.1 Master1.2 TServer1.3 Tablet 2 读写链路2.1 DDL2.2 DML2.3 事务 3 KEY 的设计4 Rocksdb 在 YB 中的一些实践总结 0 背景 YugaByteDB 的诞生也是抓住了 spanner 推行的NewSQL 浪潮的尾巴,以 PG 生态为基础 用C实现的 支持 SQL 以及 CQL 语…...
众佰诚:抖音上做生意卖什么好
随着科技的发展,越来越多的人开始利用网络平台进行创业。抖音作为目前最火的短视频平台之一,也成为了许多人选择的创业渠道。那么,在抖音上做生意卖什么好呢? 首先,我们可以考虑一些具有创新性和独特性的产品。例如,手…...
【Redis】环境配置
环境配置 Linux版本: Ubuntu 22.04.2 LTS 下载redis sudo apt install redis 启动redis redis-server 输入redis-server启动redis竟然报错了,原因是redis已经启动,网上大多数的解决方案如下: ps -ef | grep -i redis 查询redi…...
设计交换机原理图前应先理清的框图
一、系统布局图 需重点考虑“外壳、电源、风扇、主板(包含MAC、CPU、PHY)、指示灯、管理网口/串口、电口/光口等连接器”在整机中的大致位置,在系统布局图中予以体现。 二、系统框图 (1)电源整体框图; &…...
Bellman-ford 贝尔曼-福特算法
Bellman-ford算法可以解决负权图的单源最短路径问题 --- 它的优点是可以解决有负权边的单源最短路径问题,而且可以判断是否负权回路 它也有明显的缺点,它的时间复杂度O(N*E)(N是点数 , E是边数)…...
Docker数据目录迁移解决方案
前置工作 使用以下命令查询当前docker数据目录安装路径: docker info | grep "Docker Root Dir"下文以 /home/rain/docker 这个路径作为要迁移的新 Docker 安装(存储)目录 迁移方案 方法一:软链接 停掉Docker服务: systemctl…...
公共字段自动填充、菜品管理
一、公共字段填充 1.1、问题分析 1.2、实现思路 1.3、代码开发 1.3.1、自定义注解 import com.sky.enumeration.OperationType;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import jav…...
前端面试 面试多起来了
就在昨天 10.17 号,同时收到了三个同学面试的消息。他们的基本情况都是双非院校本科、没有实习经历、不会消息中间件和 Spring Cloud 微服务,做的都是单体项目。但他们投递简历还算积极,从今年 9 月初就开始投递简历了,到现在也有一个多月了。 来看看,这些消息。 为…...
Qt常见类名关系整理
1、QAbstractItemModel与QAbstractItemView 模型的基类: The QAbstractItemModel class provides the abstract interface for item model classes. Inherited By: QAbstractListModel,QAbstractProxyModel,and QAbstractTableModel 视图的基类: The QAbstractIte…...
YOLO8实战:yolov8实现行人跟踪计数
本篇文章首先介绍YOLOV8实现人流量跟踪计数的原理,文末附代码 引言:行人跟踪统计是智能监控系统中的重要功能,可以广泛应用于人流控制、安全监控等领域。传统的行人跟踪算法往往受到光照、遮挡等因素的干扰,难以实现准确跟踪。随着深度学习技术的发展,目标检测模型逐渐成为…...
shell脚本学习-2
文章目录 一、shell参数传递二、shell中的特殊变量三、shell中的函数四、shell函数中的参数 一、shell参数传递 运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收,例如,$1 表示第一个参数&…...
web3:智能合约浏览器版本的 IDE - remix 使用教程
如果你是一位web3行业的从业者,那么智能合约一定是要接触的,这里我们就智能合约浏览器版本的 IDE-remix来介绍一下,及简单的使用操作 目录 Remix简介官方网址语言设置使用编辑合约编译合约部署合约测试验证Remix简介 Remix 是一个开源的 Solidity 智能合约开发环境,是一款…...
信号类型(通信)——QPSK、OQPSK、IJF_OQPSK调制信号
系列文章目录 《信号类型(通信)——仿真》 《信号类型(通信)——QAM调制信号》 文章目录 前言 一、QPSK通信调制信号 1.1、原理 1.2、仿真 二、OQPSK通信调制信号 1.1、原理 1.2、仿真 三、IJF_OQPSK通信调制信号 1.1、…...
常用压缩文件操作函数总结
常用压缩文件操作函数总结 1- 解压gz文件 gzip -d xx.gz 2- 函数 1 打开文件 函数名: gzopen 功能描述: 打开名为file的gz文件 参数: file:文件名 mode:打开模式 r 返回值: 打开的gz文件描述符 gzFile gzopen(const char *file, const char…...
leetcode_274 H指数
1. 题意 在数组中找到最大的k, 使得至少k个数不小于k。 H指数 2. 题解 2.1 排序 从大到小排序完后,直接模拟即可。 class Solution { public:int hIndex(vector<int>& citations) {sort( citations.begin(), citations.end() );int res 0;int cur …...
微服务框架Consul--新手入门
Consul Consul 是由 HashiCorp 开发的一款软件工具,提供了一组功能,用于服务发现、配置管理和网络基础设施自动化。它旨在帮助组织管理现代分布式和微服务架构系统的复杂性。以下是Consul的一些关键方面和功能: 服务发现:Consul …...
docker运行syslog-ng,搭建日志服务器
Splunk 的数据很多是用syslog-ng 来收集的。 使用docker 来搭建syslog-ng 服务器还是很方便的。 #create network docker network create -d macvlan --subnet=192.7.0.0/16 --gateway=192.7.0.1 -o parent=ens35 docker-out docker network create -d macvlan --ipv6 --sub…...
Redis代替session实现用户验证
一、Redis代替session实现用户验证。 下图是session的实现登录需要实现的代码模块,虽然可以实现完整功能,但是仍然存在一些问题。 在以往使用session当作用户验证的过程中,会有session共享的问题,每次承担请求的tomcat是不一样…...
Ubuntu 内核降级到指定版本
reference https://www.cnblogs.com/leebri/p/16786685.html 前往此网站,找到所需的内核 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 查看系统架构 dpkg --print-architecture 二、下载安装包 注意:下载除lowlatency以外的deb包 三、安装内核 3…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
