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的某个属性赋值,该方法不会抛出异常。

原文地址:https://www.cnblogs.com/xiarongjin/p/8367860.html

时间: 2024-11-09 10:37:26

BeanUtil工具类的使用的相关文章

org.tinygroup.commons-常用工具类

org.tinygroup.commons提供了各方面的静态类封装,是一个常用工具集合工程.下面列举一些常用的工具类: 类名 说明 BeanUtil 提供对Bean对象的参数提取/深度克隆等公用方法.                                  LocaleUtil 用来处理地域和字符编码的工具类.                                  StreamUtil 基于流的静态工具类.                                 

Arrays工具类

Arraysd的静态方法能够方便的对数组进行操作,每个方法也加了注释 : 程序: import java.util.*;public class Array{        public static void main(String[] args){                int[]  arr={1,3,4,2};                System.out.println("排序前:");                printArray(arr);//打印原数组

常用工具类(System,Runtime,Date,Calendar,Math)

一.Sy 一个java.lang包中的静态工具类. 三大字段: static PrintStream err "标准"错误输出流. static InputStream in "标准"输入流. static PrintStream out "标准"输出流. 其他常用方法: 描述系统信息: 获取系统属性信息: static Properties getProperties(): (Properties是Hashtable的子类,也就是Map 的子类

iOS 中的正则匹配(工具类)

正则表达式 正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符.及这些特定字符的组合, 组成一个"规则字符串", 这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码. 在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要, 比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求) 下面让我们先来看看正则匹配常用的一些字

(九十五)音效播放方法和工具类的制作

音效通过AVFoundation框架实现,是通过函数而不是方法,因此需要进行桥接等操作,具体步骤如下. 进行音效播放,首先要得到音效的URL(只能是本地音频),然后转换为音效ID(唯一),通过ID播放音效. [音效播放方法] ①导入框架主头文件 #import <AVFoundation/AVFoundation.h> ②通过Bundle拿到本地音效,然后调用AudioServicesCreateSystemSoundID函数得到音效ID,ID为0代表无效,以此为依据可进行懒加载 @inter

spring endpoint工具类

工具类代码 @Controller public class EndpointDocController {     private final RequestMappingHandlerMapping handlerMapping;     @Autowired     public EndpointDocController(RequestMappingHandlerMapping handlerMapping) {         this.handlerMapping = handler

web常用的工具类总结

数据库的链接的操作类 package utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBConnection { private static final String DBDRIVER = "com.m

字符串工具类(指定字符串的长度和判断是否为空等方法)

package com.sec.util; /** * 字符串工具类 * @author Administrator * */public class StringUtil { /** * 过滤<,>,\n 字符串的方法 * @param input * @return */ public static String filterHTML(String input){ if(input == null || input.length() == 0){ return input; } input

java并发的艺术-读书笔记-第八章常用的并发工具类

jdk中提供了几个非常有用的工具类,分别是CountDownLatch,CyclicBarrier和semaphore exchanger CountDownLatch:允许一个或者多个线程等待其他线程完成操作 public class CountDownLatchTest{ static CountDownLatch c = new CountDownLatch(2); public static void main(String[] args){ new Thread(new Runnabl