上一篇内省(Introspector)讲到的是采用JavaAPI中的类来操作bean及其属性,而Apache也开源了第三方框架来简化和丰富了对bean属性的操作,这个框架就是BeanUtils。

使用BeanUtils记得先导入BeanUtils开发包,同时BeanUtils也需要将commons-logging一起导入,具体请看《配置BeanUtils包,同时也是对导入第三包的步骤说明》。

  如果我们要设置某个bean的属性,直接使用setProperty(Object bean, String name, Object value)方法即可,第一个参数为要设置的对象,第二个参数为属性名称,第三个参数为属性值。下面是对一个Person这个Bean对象的操作:

     Person p = new Person();
BeanUtils.setProperty(p, "age", 25);
System.out.println(p.getAge());

输出:25

  可以看到这个比属性描述器(PropertyDiscreptor)要简单快捷。

  BeanUtils的功能不止这一点,它还能将字符串转换为基本数据类型。这点对于接收从表单来的数据(都是字符串)来说实在是太有用了,下面是一个简单的例子:

     Person p = new Person();
BeanUtils.setProperty(p, "age", "25");
System.out.println(p.getAge());

  在这个例子中,Person的age属性类型为“int”,而在调用setProperty 时使用的属性值为字符串,因此BeanUtils就将字符串”25”转换为了整数型25值。

  最后再次声明,BeanUtils对于字符串的转换只支持八大基本数据类型!

  但是如果在Person中有一个Date类型的属性,简单的BeanUtils是无法做到使某个“1991-7-1”字符串能转换成Date类型的,那么都说了BeanUtils功能很强大,因此可以使用BeanUtils包中的ConvertUtils注册一个转换器,使得字符串能够转换成日期Date类型。

  要使用ConvertUtils注册转换器,只需调用register方法即可:

  从register方法中可以看出,第二个参数是要转换成的最终目标类型,第一个参数必须是一个Converter类的实例,而我们继续看这个Converter,发现是一个接口,并且在这个接口中只有一个convert方法,因此我们可以使用匿名内部类来实现这个接口,并在实现方法中处理将字符串转换为日期Date类型。

 Person p = new Person();
ConvertUtils.register(new Converter() { @Override
public <T> T convert(Class<T> type, Object value) {
if(value == null) {
return null;
}
if(!(value instanceof String)) {
throw new ConversionException("传入类型错误");
}
String dateStr = (String) value;
if(dateStr.trim().equals("")) {
return null;
} SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
return (T)format.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
} },Date.class); BeanUtils.setProperty(p, "birthday", "1991-7-1");
System.out.println(p.getBirthday());

输出:

  

  当然上面我们使用的是自己来写这个接口,对于Apache的BeanUtils来说,Converter这个接口Apache已经帮我们写好了很多实现Converter接口的类了,因此我们可以使用这些现有的转换器类,比如有关日期的DateConverter或DateLocaleConverter。

  对上面的代码进行修改:

   ConvertUtils.register(new DateLocaleConverter(), Date.class);

   Person p = new Person();
  BeanUtils.setProperty(p, "birthday", "1991-7-2");
  System.out.println(p.getBirthday());

输出:

  

可以看到现有的转换器实现类能使我们的功能变得代码简洁。

  但是这样的转换器有时候并不能满足我们的需求,比如我们将日期字符串设置为空字符:

   ConvertUtils.register(new DateLocaleConverter(), Date.class);

   Person p = new Person();
  BeanUtils.setProperty(p, "birthday", "");
5   System.out.println(p.getBirthday());

输出报错:

  

也就是这个转换器无法判断字符串为空的情况,直接抛出异常,健壮性不如自己写的转换器,当然有时候我们只需要有处理异常的情况也可以使用这个现有转换器,总之灵活应用。

  BeanUtils还能将Map集合中的值填充某个对象中的属性,只要Map集合的Key与属性名相同,这点非常适合web中的Request将数据封装到某个bean中。

   Map<String,String> map = new HashMap<>();
  map.put("name", "Ding");
  map.put("age", "25");
  map.put("birthday", "1991-7-1");
  ConvertUtils.register(new DateLocaleConverter(), Date.class);
  Person p = new Person();   BeanUtils.populate(p, map);   System.out.println(p.getName());
  System.out.println(p.getAge());
  System.out.println(p.getBirthday());

输出:

  

最后再说一次,要使用populate方法,Map集合的key值必须要和对象中的属性名一致才行!

内省(二)之BeanUtils工具类的更多相关文章

  1. 第13天 JSTL标签、MVC设计模式、BeanUtils工具类

    第13天 JSTL标签.MVC设计模式.BeanUtils工具类 目录 1.    JSTL的核心标签库使用必须会使用    1 1.1.    c:if标签    1 1.2.    c:choos ...

  2. 利用BeanUtils工具类封装表单数据

    一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...

  3. BeanUtils 工具类

    一.BeanUtils 概述     BeanUtils 是阿帕奇提供的一套专门用于将一些数据封装到java对象中的工具类;          名词:javaBean:特定格式的java类称为java ...

  4. 二维码工具类 - QrcodeUtils.java

    二维码工具类,提供多种生成二维码.解析二维码的方法,包括中间logo的二维码等方法. 源码如下:(点击下载 - QrcodeUtils.java.MatrixToImageWriterEx.java. ...

  5. Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils

    Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils Spring 系列目录(https://www.cnblogs.com/binary ...

  6. 并发编程(二)concurrent 工具类

    并发编程(二)concurrent 工具类 一.CountDownLatch 经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作. import java.util.concurren ...

  7. java二维码工具类,中间带LOGO的,很强大

    jar包下载maven 配置: Xml代码 收藏代码 <dependency> <groupId>com.google.zxing</groupId> <ar ...

  8. Java使用Zxing生成、解析二维码工具类

    Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2). ...

  9. JavaWeb 之 BeanUtils 工具类

    在上一个用户登录案例中,当从浏览器接收参数后,还需要创建 JavaBean 类,对其的属性每一项赋值,如果属性少,可以手动完成,但是当属性非常多,这时就发现非常不方便,在这里提供一个可以封装 Java ...

随机推荐

  1. Android模拟器启动异常

    设置系统环境变量的 ANDROID_SDK_HOME为任意一个目录,我的目录:C:\android_avd, 关闭eclipse,然后重新启动eclipse, 删除之前创建的AVD, 然后重新创建,即 ...

  2. Python 数据处理扩展包: pandas 模块的DataFrame介绍(创建和基本操作)

    DataFrame是Pandas中的一个表结构的数据结构,包括三部分信息,表头(列的名称),表的内容(二维矩阵),索引(每行一个唯一的标记). 一.DataFrame的创建 有多种方式可以创建Data ...

  3. Python 2.7 学习笔记 模块和包

    我们来考虑下如下几种场景: 1.编写一个python程序,如果程序比较简单,则可以把代码放到一个python文件中.但如果程序功能比较多,可能需要多个python文件来组织源代码.而这些文件之间的代码 ...

  4. javaCore分析示例(转)

    当两个或多个线程彼此形成循环依赖关系时,就出现了死锁.例如,如果线程 A 处于等待线程 B 的等待状态,而同时线程 B 处于等待线程 A 的等待状态,则出现了死锁.一旦形成此情况,线程 A 和线程 B ...

  5. 网络爬虫 kamike.collect

    Another Simple Crawler 又一个网络爬虫,可以支持代理服务器的FQ爬取. 1.数据存在mysql当中. 2.使用时,先修改web-inf/config.ini的数据链接相关信息,主 ...

  6. ArduinoYun教程之配置Arduino Yun环境

    ArduinoYun教程之配置Arduino Yun环境 配置Arduino Yun 不管你使用前面介绍的哪种方式连接Arduino Yun.如今都能够配置你的Arduino Yun了.首先须要的是使 ...

  7. 华为s5700 添加与删除vlan

    新建vlan 删除vlan ① 检查该VLAN下是否存在成员接口,使用如下命令:display vlan all② 如存在成员接口,则进入该接口视图,删除该成员,否则可略过此步骤,例如:interfa ...

  8. php:兄弟连之面向对象版图形计算器2

    上篇说到通过result.class.php来分流,因为三个类都继承了shape这个类,让我们来看一下,面向对象中的继承. shape.class.shape文件 <?php abstract ...

  9. Android 之SparseArray<E>详解

    SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch) pr ...

  10. HTTP协议之ETag字段

    整理者:华科小涛:http://www.cnblogs.com/hust-ghtao/ 前段时间参加某公司的面试,问我ETag字段,当时说的不是很清楚,找了些资料,整理为此篇. 简单的说ETag即类似 ...