上一篇内省(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. java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法 只需把这三个commons-pool.jar ...

  2. Android:Service的注意点以及一些知识点

    1.自己练习service的start()方法开启一个service服务的时候,不管怎么开启按钮,就是开启不了service服务,控制台也没有报错信息, app不闪退,代码就那么几行.找了好久找不出来 ...

  3. hdu3483之二项式展开+矩阵快速幂

    A Very Simple Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  4. 进入MFC讲坛的前言(五)

    框窗.视图和文档及其关系 MFC架构的另外一个特色是它的框窗.视图和文档这个三位一体的结构,它是一个典型的MVC(Model.View and Controler)结构.严格的讲,框窗不属于MVC中的 ...

  5. Java设计模式菜鸟系列(九)外观模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39805735 外观模式(Facade):是为了解决类与类之间的依赖关系的,像spring一 ...

  6. [置顶] Android自定义控件大全

    1,自定义Edittext, TextView,带底线的Edittext, TextView 2.自定义圆形ImageView,圆角ImageView 3,下拉刷新LinearLayout 4,多点触 ...

  7. c: c代码书写规范

    排版: 较长的语句或函数过程参数(>80字符)要分成多行书写, 长表达式要在低优先级操作符处划分新行,操作符放在新行之首, 划分出的新行要进行适当的缩进,使排版整齐,语句可读 参考: 1. 运算 ...

  8. Qt实现QQ好友下拉列表(用QListView实现,所以还得定义它的Model)

    偶然发现Qt有个控件可以实现下拉列表,所以就试着实现一下类似QQ面板的下拉列表,这里主要实现几个功能: 1.可以删除列表中图标 2.可以像qq一样的,把某个分组下的图标转移到另外的分组 3.添加分组 ...

  9. svn回滚版本1

    我刚开始使用SubVersion时, 想把svn代码库回滚到以前某个版本,  上网找来找去都找不到(那时文档比较少), 让我郁闷了好一阵子.  现在记录一下 SubVersion回滚的方法: 第一种方 ...

  10. JQuery遍历json数组的3种方法

    这篇文章主要介绍了JQuery遍历json数组的3种方法,本文分别给出了使用each.for遍历json的方法,其中for又分成两种形式,需要的朋友可以参考下 一.使用each遍历 $(functio ...