常用jar包之commons-beanutils使用

BeanUtils用法详解 Apache Commons BeanUtils是Apache软件基金会的一个子项目,它提供了对Java反射的简单包装,旨在简化JavaBean的操作。BeanUtils主要用于实现JavaBean之间的属性复制,使得开发者能够轻松地在不同的JavaBean之间传递数据。通过本文,我们详细了解了BeanUtils的基本用法,以及如何在JavaBean之间进行属性复制和值转换。希望这些知识能够帮助你更好地利用BeanUtils简化Java开发中的属性操作。 阅读详情

Jakarta Commons项目提供了相当丰富的API,我们之前了解到的Commons Lang只是众多API的比较核心的一小部分而已。Commons下面还有相当数量的子项目,用于解决各种各样不同方向的实际问题,BeanUtils就是其中的一个,用于处理JavaBeans。它利用Java的反射机制,从动态的生成对bean的getter和setter的调用代码,到模拟创建一个动态的bean,等等。这个包看似简单,却是很多开源项目的基石:如在著名的Struts和Spring Framework中,我们都能找到BeanUtils的影子。大家猜猜看,有哪位名人是BeanUtils的作者之一?没错,就是Struts的创始人Craig McClanahan。

 

BeanUtils最核心的好处在于:我们在编码时,并不需要知道我们处理的JavaBeans具体是什么类型,有哪些属性,这些信息是可以动态获取的,甚至我们都可以不必去关心事实上是否存在这样一个具体的JavaBean类。我们只需要知道有一个JavaBean的实例,我们需要从中取得某个属性,设定某个属性的值,或者仅仅是需要一个属性表。要做到这些,依靠Sun提供的JavaBean规范似乎找不到一个很直接的方式,除非硬编码,将getXxxx()和setXxxx()直接写进我们的程序。但是这样就大大增加了代码的复杂度、耦合性和维护成本。还好Commons BeanUtils对这个问题提供了一种优雅的解决方案。

 

我们有两种途径获取Commons BeanUtils的binary:

1- 从Struts、Spring或者任何依赖BeanUtils的开源产品的发行包中找到相应的jar文件;

2- 从http://www.apache.org/dist/jakarta/commons/beanutils/binaries/下载。

 

Commons BeanUtils的源码下载地址:

http://www.apache.org/dist/jakarta/commons/beanutils/source/

 

Commons BeanUtils一共包括如下5个包:

 

org.apache.commons.beanutils – 核心包,定义一组Utils类和需要用到的接口规范

org.apache.commons.beanutils.converters – 转换String到需要类型的类,实现Converter接口

org.apache.commons.beanutils.locale – beanutils的locale敏感版本

org.apache.commons.beanutils.locale.converters – converters的locale敏感版本

org.apache.commons.collections – beanutils使用到的Collection类

 

其中需要我们特别关注的是这个org.apache.commons.beanutils包,其他包都是起辅助作用的。接下来我们就来看看如何使用beanutils包

 

     1.PropertyUtils


  它支持三种类型的属性值-Simple,Indexed,Mapped
  Simple属性访问方法
  PropertyUtils.getSimpleProperty(Object bean, String name)
  PropertyUtils.setSimpleProperty(Object bean, String name, Object value)


  实现代码:
   Employee employee = ...;
   String firstName = (String)
   PropertyUtils.getSimpleProperty(employee, "firstName");
   String lastName = (String)
   PropertyUtils.getSimpleProperty(employee, "lastName");
   ... manipulate the values ...
   PropertyUtils.setSimpleProperty(employee, "firstName", firstName);
   PropertyUtils.setSimpleProperty(employee, "lastName", lastName);


  Indexed属性访问方法
  PropertyUtils.getIndexedProperty(Object bean, String name)
  PropertyUtils.getIndexedProperty(Object bean, String name, int index)
  PropertyUtils.setIndexedProperty(Object bean, String name, Object value)
  PropertyUtils.setIndexedProperty(Object bean, String name, int index, Object value)


  实现代码:
  Employee employee = ...;
   int index = ...;
   String name = "subordinate[" + index + "]";
   Employee subordinate = (Employee)
   PropertyUtils.getIndexedProperty(employee, name);//根据value取得属性
   Employee employee = ...;
   int index = ...;
   Employee subordinate = (Employee)
   PropertyUtils.getIndexedProperty(employee, "subordinate", index);//根据索引
  值取的属性值


  Mapped属性访问方法
  PropertyUtils.getMappedProperty(Object bean, String name)
  PropertyUtils.getMappedProperty(Object bean, String name, String key)
  PropertyUtils.setMappedProperty(Object bean, String name, Object value)
  PropertyUtils.setMappedProperty(Object bean, String name, String key, Object value)
  实现代码:
  Employee employee = ...;
   Address address = ...;
   PropertyUtils.setMappedProperty(employee, "address(home)", address);//根据数组
  //内的值来去的相应的属性值
   Employee employee = ...;
   Address address = ...;
   PropertyUtils.setMappedProperty(employee, "address", "home", address);


  Nested属性访问方法//Nested的意思是参数中包含组件
  PropertyUtils.getNestedProperty(Object bean, String name)
  PropertyUtils.setNestedProperty(Object bean, String name, Object value)
  实现代码:
  String city = (String) PropertyUtils.getNestedProperty(employee,
  "address(home).city");


  2.BeanUtils.DynaBean and BeanUtils.DynaClass 接口介绍
  DynaBean必须有一个bean来实现这个接口,DynaClass必有一个bean的属性集来实现


  BasicDynaBean and BasicDynaClass - 基本的 Dynamic 类型
  基本的API:
  BasicDynaClass(java.lang.String name, java.lang.Class dynaBeanClass, DynaProperty[] properties)
  BasicDynaBean(DynaClass dynaClass)
  我们定义一下基本的代码:
  //定义动态属性集
  DynaProperty[] props = new DynaProperty[]{
   new DynaProperty("address", java.util.Map.class),
   new DynaProperty("subordinate", mypackage.Employee[].class),
   new DynaProperty("firstName", String.class),
   new DynaProperty("lastName", String.class)
   };
  //创建动态类来设定动态属性值
   BasicDynaClass dynaClass = new BasicDynaClass("employee", null, props);
  DynaBean employee = dynaClass.newInstance();
   employee.set("address", new HashMap());
   employee.set("subordinate", new mypackage.Employee[0]);
   employee.set("firstName", "Fred");
   employee.set("lastName", "Flintstone");


  ResultSetDynaClass (Wraps ResultSet in DynaBeans) - 使用 ResultSet 的
  Dynamic JavaBean
  API:
  ResultSetDynaClass(java.sql.ResultSet resultSet)
  ResultSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)
  Connection conn = ...;
   Statement stmt = conn.createStatement();
   ResultSet rs = stmt.executeQuery
   ("select account_id, name from customers");
   Iterator rows = (new ResultSetDynaClass(rs)).iterator();
   while (rows.hasNext()) {
  //利用动态bean进行输出
   DynaBean row = (DynaBean) rows.next();
   System.out.println("Account number is " +
   row.get("account_id") +
   " and name is " + row.get("name"));
   }
   rs.close();
   stmt.close();


  RowSetDynaClass (Disconnected ResultSet as DynaBeans) - 使用 RowSet 的 Dynamic
  JavaBean
  API:
  RowSetDynaClass(java.sql.ResultSet resultSet)
  RowSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)
   Connection conn = ...; // 从缓冲池取得连接
   Statement stmt = conn.createStatement();
   ResultSet rs = stmt.executeQuery("SELECT ...");
   RowSetDynaClass rsdc = new RowSetDynaClass(rs);
   rs.close();
   stmt.close();
   ...; //关闭连接返回缓冲池
   List rows = rsdc.getRows();
   ...; // 处理得到的行


  3.BeanUtils.ConvertUtils 介绍
  这个包主要用来转换从request传递过来的函数
  主要函数:
  ConvertUtils().convert(java.lang.Object value)
  ConvertUtils().convert(java.lang.String[] values, java.lang.Class clazz)
  ConvertUtils().convert(java.lang.String value, java.lang.Class clazz)
  实现例子:
   HttpServletRequest request = ...;
   MyBean bean = ...;
   HashMap map = new HashMap();
   Enumeration names = request.getParameterNames();
   while (names.hasMoreElements()) {
   String name = (String) names.nextElement();
   map.put(name, request.getParameterValues(name));
   }
   BeanUtils.populate(bean, map);//用ConvertUtils进行转换
  目前支持的转换类型:
  sjava.lang.BigDecimal
  java.lang.BigInteger
  boolean and java.lang.Boolean
  byte and java.lang.Byte
  char and java.lang.Character
  java.lang.Class
  double and java.lang.Double
  float and java.lang.Float
  int and java.lang.Integer
  long and java.lang.Long
  short and java.lang.Short
  java.lang.String
  java.sql.Date
  java.sql.Time
  java.sql.Timestamp

 

 

 

 

【Java基础知识 54】Java BeanUtils用法详解,附源码分析 目录一、org.apache.commons.beanutils.BeanUtils简介二、使用的前置条件三、添加pom四、代码实例1、为属性赋值2、拷贝对象,为对象赋值3、map转bean4、bean转map五、Apache的BeanUtils与Spring的BeanUtils 一、org.apache.commons.beanutils.BeanUtils简介 BeanUtils是Apache Commons组件的成员之一,主要用于简化JavaBean封装数据的操作。​ 简化反射封装参数的步骤,给对象封 阅读详情

相关推荐

commons-beanutils.jar

commons-beanutils.jar

BeanUtils—org.apache.commons.beanutils.BeanUtils

BeanUtils

底层码农 2万+

Codesys电子凸轮功能块MC_CamIn的masteroffset和slaveoffset参数的使用

问题1:在Codesys使用作轴电子凸轮时,MC_CamTableSelect的参数设置为MasterAbsolute=1,SlaveAbsolute=1,此设置为绝得模式, 此时主从轴当前位置都不为零时,此时Masteroffset=0、slaveOffset=0,凸轮启时出现突变,实轴无法启动。问题分析:在觉得模式下,主轴位置和从轴为是对应凸轮表的相位的,Masteroffset=0、slaveOffset=0,启动点时在主轴位置=0,从轴位置=0的点启动,此时主轴当前位置不为零则主从轴位置发生突变,

weixin_43587371的博客 1797

常用的工具类之 Apache Commons BeanUtils 简单使用与部分原理解析

整理了开发中常用的 JavaBean 处理工具类,包括 Beanutils、PropertyUtils、CollectionUtils、ConvertUtils。近期使用中发现 BeanUtils.populate 方法存在 bug,实体类属性与 Map 中 key 值一模一样,但是会有一些属性拷贝完未null,而且 debug 源码未果,在这里推荐大家一个集成程度更高的 Util 工具类 hutool BeanUtils:主要提供了对于 JavaBean 进行各种操作,比如对象,属性复制等等,自动转换数

m0_37225642的博客 1万+

kubedns-coredns部署pod出现not ready问题

文章目录遇到的问题1、发现问题2、排查问题3、解决方法 coredns的实例health_check不通过的问题,排查和解决方法 遇到的问题 1、发现问题 pod启动但是未ready 查看是readiness失败 使用对应的URL进行curl,发现真的返回503 2、排查问题 查看错误日志,发现一堆这个错误"waiting on : kubernetes" 网上相关的问题解答 这个跟测试场景不一样,这个案例是开了防火墙,可以确认我这个案例的机器没有开防火墙,但它提醒了一点,coredns是需要访问ap

u012533481的博客 2844

机械工程师如何用Codex实现CAD自动化:从重复劳动到智能设计

在机械设计领域,CAD二次开发长期面临学习门槛高、维护成本大的难题。随着AI编程助手如Codex的出现,通过自然语言生成可执行代码,工程师无需精通编程即可实现图纸批量处理、BOM表自动生成、参数化建模等任务。这种技术将重复性操作自动化,显著提升设计效率,让工程师聚焦于核心创新。应用场景涵盖批量修改图纸属性、跨软件数据流转、自动打印等。本文分享机械工程师利用Codex落地自动化的实战经验与避坑指南。

weixin_32296621的博客 356

java convert在哪个包_常用jar包之commons-beanutils使用

Jakarta Commons项目提供了相当丰富的API,我们之前了解到的Commons Lang只是众多API的比较核心的一小部分而已。Commons下面还有相当数量的子项目,用于解决各种各样不同方向的实际问题,BeanUtils就是其中的一个,用于处理JavaBeans。它利用Java的反射机制,从动态的生成对bean的getter和setter的调用代码,到模拟创建一个动态的bean,等等。...

weixin_42511587的博客 1629

1998年高教社杯全国大学生数学建模竞赛 B 题:《灾情巡视路线》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 881

java开发常用到的jar包总结

<!-- p {margin-bottom:0.08in} --> <!-- p {margin-bottom:0.08in} --> <!-- p {margin-bottom:0.08in} --> java开发中主要用到的jar包介绍 commons-io.jar: 可以看成是java.io的扩展,用来帮助进行IO

chaod5659的专栏 1万+

【35】软考软件设计师——设计模式代码填空(C++版)满分精讲|第5/6题二选一必考

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第35篇,聚焦下午选做题**第5/6题C++版设计模式代码填空**,与上一篇Java版形成双子配套,单题分值稳定12~15分。全文超4000字深度拆解C++独有核心考点:虚函数/纯虚函数、构造与析构函数规范、继承权限、模板类编程在设计模式中的应用;精讲单例、工厂、策略、观察者、适配器五大高频模式的C++专属代码写法,标注所有填空核心点位、语法陷阱、内存安全规范

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 543

AutoSAR配置与实践(实践篇)13.1 如何添加一个NVM BLOCK

解决办法:如下红框选项都不要自定义,否则无法自动生成对应RAM/ROM映射接口函数。传送门–AUTOSAR配置与实践—总目录传送门–AUTOSAR配置与实践—总目录。

nihaoljq2010的博客 3035

java开发常用的jar包的作用解释

转载自:http://blog.youkuaiyun.com/chaod5659/article/details/8250845 java开发中主要用到的jar包描述 commons-io.jar: 可以看成是java.io的扩展,用来帮助进行IO功能开发.它包含三个主要的领域:Utilityclasses-提供一些静态方法来完成公共任务.Filters-提供文件过滤器的各种实现.S

HN刘宗亮的专栏 3838

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

路~可以走过 3682

JavaWeb开发(十八)应用jar包

在Java开发中,数据库连接池是管理数据库连接的重要工具,它能够有效地提高数据库访问性能,减少系统资源的消耗。c3p0,全称为com.mchange.v2.c3p0,是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0-0.9.5.2.jar是该连接池的一个特定版本,它包含了所有必要的类和资源文件,用于在项目中集成并使用c3p0功能。

qq_36158551的博客 893

STM32入门教程:智能汽车控制

智能汽车是近年来快速发展的领域之一,它结合了嵌入式系统、传感器和通信技术,通过智能化的控制算法和决策系统实现自主导航、避障、环境感知等功能。在这篇教程中,我们将以 STM32 微控制器为核心,通过编写代码案例来介绍智能汽车的控制原理和实现方法。步骤三:决策与执行 最后,我们根据传感器数据做出相应的决策,并执行相应的动作。案例:智能汽车的避障功能 在这个案例中,我们将实现智能汽车的避障功能。感知系统负责感知汽车周围的环境,包括障碍物的距离、车辆的角度等信息。下面我们通过一个具体的案例来演示代码的编写。

2401_85258012的博客 926

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【免费下载】 org.json.JSONObject Jar包下载

org.json.JSONObject Jar包下载 【下载地址】org.json.JSONObjectJar包下载 org.json.JSONObject Jar包下载本仓库提供了一系列与`org.json.JSONObject`相关的jar包,这些jar包是开发过程中常用的依赖库,能够帮助开发者更方便地处理JSON数...

gitblog_09809的博客 2188

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: 常用jar包之commons-lang使用
下一篇: 常用jar包之commons-collection使用
terryzero
博客等级 码龄19年 700粉丝 232原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值