BeanUtil工具类的使用
BeanUtils的使用
1.commons-beanutils的介绍
commons-beanutils是Apache组织下的一个基础的开源库,它提供了对Java反射和内省的API的包装,依赖内省,其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致了大量的get/set代码堆积,增加了代码长度和阅读代码的难度,现在有了BeanUtils,我们对JavaBean属性的处理就方便很多。
2.BeanUtils的使用
BeanUtils是commons-beanutils包下的一个工具类,如果想在我们的项目中使用这个类需要导入以下两个jar包:
l commons-beanutils.jar
l commons-logging.jar
下面我们就来练习如何使用BeanUtils,案例详情请参考BeanUtils使用案例详解,点击此处下载案例源代码,具体如下:
(1)创建一个web应用,Example5,将上面说到的两个jar包拷贝的WEB-INF/lib下;
(2)在该应用下的src目录下新建一个Class类,名称为Person,主要代码如例1-1所示:
例1-1 Person.java
|
public class Person { private Stringname; private int age; private Stringgender; private boolean bool; 此处省略以上四个属性的get/set方法 @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]"; } } |
例1-1中,定义了四个成员变量,并重写了toString()方法。
(3)在src目录下新建一个Class类,名称为Demo,在该类中定义了一个单元测试方法,主要代码如例1-2所示:
例1-2 Demo.java
|
public class Demo { @Test public void fun1() throws Exception{ String className="cn.itcast.domain.Person"; Class clazz=Class.forName(className); Object bean=clazz.newInstance(); BeanUtils.setProperty(bean, "name", "张三"); BeanUtils.setProperty(bean, "age", "23"); BeanUtils.setProperty(bean, "gender", "男"); BeanUtils.setProperty(bean, "xxx", "XXX"); System.out.println(bean); } } |
例1-2中,利用反射获得Person类的对象,然后使用BeanUtils类的静态方法setProperty(Object bean,String name,Object value)为指定bean的指定属性赋值。该方法的第一参数是javaBean对象,第二个参数是javaBean的属性,第三个参数是属性的值。
(4)运行Demo类的单元测试方法fun1(),控制台打印结果如图1-1所示:
图1-1 控制台打印结果
图1-1中,Person信息的打印格式是我们再Person类的toString()方法中设置的。
(5)使用BeanUtils的getProperty(Object bean,String name)方法获取指定bean的指定属性值,如例1-3所示:
|
public class Demo { @Test public void fun1() throws Exception{ String className="cn.itcast.domain.Person"; Class clazz=Class.forName(className); Object bean=clazz.newInstance(); BeanUtils.setProperty(bean, "name", "张三"); BeanUtils.setProperty(bean, "age", "23"); BeanUtils.setProperty(bean, "gender", "男"); BeanUtils.setProperty(bean, "xxx", "XXX"); System.out.println(bean); String age = BeanUtils.getProperty(bean, "age"); System.out.println(age); } } |
(6)测试fun1方法,控制台打印结果如图1-2所示:
图1-2 控制台打印结果
以上是通过BeanUtils类的setProperty()和getProperty()方法对javaBean属性的设置和获取;开发中可能会有这样的需求:将表单提交过来的请求参数封装在一个javaBean中,这个时候我们再使用BeanUtils的setProperty()和getProperty()方法就会很麻烦;因此BeanUtils又为我们提供了一个静态方法populate(Object bean,Map properties),其中第二个参数就是封装请求参数的Map,我们可以通过request.getParameterMap()方法获取一个封装了所有请求参数的Map对象。
下面通过一个例子来了解BeanUtils类的populate(Object bean,Map properties)方法,如下所示:
(7)在Example5中创建一个javaBean类,User,主要代码如例1-4所示:
例1-4 User.java
|
public class User { private Stringusername; private String password; 此处省略User类的成员变量的get/set方法 @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; } } |
(8)在Demo类中再定义一个单元测试方法fun2,主要代码如例1-5所示:
例1-5 fun2()方法
|
@Test public void fun2() throws Exception { Map<String,String> map = new HashMap<String,String>(); map.put("username", "zhangSan"); map.put("password", "123"); User user = new User(); BeanUtils.populate(user, map); System.out.println(user); } |
例1-5中,将map里面的数据封装到javaBean中,这里有一个要求:Map中的key值要与JavaBean中的属性名称保持一致,否则封装不进去。
(9)测试fun2方法,控制台打印结果如图1-3所示:
图1-3 控制台打印结果
现在我们再对BeanUtils进行封装,封装成一个工具类,我们之前也封装过类似的一个工具类,该工具类中提供了一个方法用来获取不重复的32位长度的大写字符串,如下所示:
(10)在Example5中创建一个工具类,名称为CommonUtils,在该类中定义一个方法,用来将map中的数据封装到javaBean中,主要代码如例1-6所示:
例1-6 CommonUtils.java
|
public class CommonUtils { /** * 生成不重复的32位长的大写字符串 * @return */ public static String uuid() { return UUID.randomUUID().toString().replace("-","").toUpperCase(); } /** * 把map转换成指定类型的javaBean对象 * @param map * @param clazz * @return */ public static <T> T toBean(Map map, Class<T> clazz) { try { /* * 1. 创建指定类型的javabean对象 */ T bean = clazz.newInstance(); /* * 2. 把数据封装到javabean中 */ BeanUtils.populate(bean, map); /* * 返回javabean对象 */ return bean; } catch(Exception e) { throw new RuntimeException(e); } } } |
例1-6中,CommonUtils定义了一个静态的泛型方法:toBean(Map map,Class<T> clazz),根据传递的参数来判断将map中的数据封装到哪个javaBean中。当中来利用了反射获得指定类型的javaBean对象,然后再调用BeanUtils类的populate()方法。
(11)在Demo类中再定义一个单元测试方法fun3,主要代码如例1-7所示:
例1-7 fun3()方法
|
@Test public void fun3() { Map<String,String> map = new HashMap<String,String>(); map.put("username", "lisi"); map.put("password", "123"); /* * request.getParameterMap(); */ User user = CommonUtils.toBean(map, User.class); System.out.println(user); } |
例1-7中,将map中的数据使用CommonUtils类的toBean()方法封装到user中,然后返回一个user对象。
(12)运行fun3()方法,控制台打印结果如图1-4所示:
图1-4 控制台打印结果
需要注意的是,在使用BeanUtils类的setProperty()、getProperty()和populate()方法时都抛出了异常,我们制作的帮助类需要对异常进行处理,这样在调用这个帮助类的这个方法时就不用再对异常进行处理。另外,在调用BeanUtils的setProperty()方法时,如果设置的属性不存在或者没有给javaBean的某个属性赋值,该方法不会抛出异常。
BeanUtil工具类的使用的更多相关文章
- JavaWeb基础Day17 (JSP EL表达式 jstl标签库 beanutil工具类)
JSP jsp的实质就是指在html界面中嵌入Java代码 jsp脚本 <% Java代码 %> 相当于写在service方法中. <%=java 变量或者表达式 %> ...
- 03-封装BeanUtil工具类(javabean转map和map转javabean对象)
package com.oa.test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import ja ...
- apache-beanutil工具类的使用
BeanUtil工具类是apache commons中的项目 使用BeanUtil除了需要 commons-beanutils-1.8.3.jar 外,可能需要记录错误日志信息,再加入 commons ...
- JSON转换的原创工具类
进来在项目中总是遇到ArrayList线性表需要转化成JSONArray的场景,或者Java对象和JSON字符串之间的转化问题,于是乎自己写了一个粗糙的工具类,经过初步的测试,暂时还未发现什么bug, ...
- Java工具类之Apache的Commons Lang和BeanUtils
Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,但是JDK没能提供的机能,最大化的减少重复代码的编写. htt ...
- spring工具类获取bean
import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebAppl ...
- BeanUtils工具类copyProperties方法缺点及解决
使用类为spring-beans:4.3.13release包中的 org.springframework.beans.BeanUtils BeanUtils.copyProperties(Objec ...
- hutoolJava工具类的使用
前言 安装 友情开源项目 Hutool相关博客(软文) 捐赠使用公开 核心(Hutool-core) 克隆 支持泛型的克隆接口和克隆类 类型转换 类型转换工具类-Convert 自定义类型转换-Con ...
- Maven基础&&Spring框架阶段常用工具类整理
常用工具类 1.密码加密工具类: package com.itheima.utils; import java.security.MessageDigest; import sun.misc.BASE ...
随机推荐
- rails使用Kindeditor网页编辑器
在gemfile中加入(后面版本别丢) gem 'rails_kindeditor', '~> 0.5.0' $ bundle 创建配置文件,并且引入js rails g rails_kinde ...
- 实际项目开发过程中常用C语言函数的9大用法
C语言是当中最广泛的计算机编程语言,是所有计算机编程语言的祖先,其他计算机编程语言包括当前流行的Java语言,都是用C语言实现的,C语言是编程效率最高的计算机语言,既能完成上层应用开发,也能完成底层硬 ...
- 控制 matplotlib 子图大小
效果图: 代码: import numpy as np import matplotlib.pyplot as plt '''调整 matplotlib 子图的大小''' x1 = np.linspa ...
- 【转载】COM 组件设计与应用(十五)——连接点(vc6.0)
原文:http://vckbase.com/index.php/wv/1256.html 一.前言 上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了. 二.原理 图一.连接点组件原理图.左侧 ...
- cap原则(cap定理)与base理论
CAP定理c:一致性 Consistency: 分布式系统中,所有数据备份,同一时刻存在一样的值.当在分布式环境中,当一个地方写入返回成功的结果,其他地方也应读取到最新的数据.a:可用性 Availa ...
- 180815-Spring之RestTemplate中级使用篇
Spring之RestTemplate中级使用篇 前面一篇介绍了如何使用RestTemplate发起post和get请求,然而也只能满足一些基本的场景,对于一些特殊的如需要设置请求头,添加认证信息等场 ...
- PSR编码规范
PSR-1 代码风格规范(1)常量命名:类中的常量所有字母都必须大写,单词间用下划线分隔(2)类命名:类的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范(3)方法命名:方法名称必须符合 c ...
- [Unity Shader] 常用的数值类型和语义
书看到第八章,跟随写了一些例子,但有些数值类型的使用还是需要特别注意,经常需要查阅,在这里做一下总结. 1 ShaderLab属性类型和Cg变量类型的匹配关系 Color.Vector:float4, ...
- NO--15 微信小程序,scroll-view选项卡和跳转
大多数的商城类小程序都有这个功能,点击“全部订单”,“待付款”,“待发货”,“待收货”,“已完成”,会跳转页面且跳至与之相对应的选项卡中.所以我们在开发该小程序时也做了相同的功能.如下图: scr ...
- 【坚持】Selenium+Python学习记录 DAY8
2018/05/ 28 [来源:菜鸟教程](http://www.runoob.com/python3/python3-examples.html) 继续敲类相关的代码 #No.1 class peo ...