内省(二)之BeanUtils工具类
上一篇内省(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工具类的更多相关文章
- 第13天 JSTL标签、MVC设计模式、BeanUtils工具类
第13天 JSTL标签.MVC设计模式.BeanUtils工具类 目录 1. JSTL的核心标签库使用必须会使用 1 1.1. c:if标签 1 1.2. c:choos ...
- 利用BeanUtils工具类封装表单数据
一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...
- BeanUtils 工具类
一.BeanUtils 概述 BeanUtils 是阿帕奇提供的一套专门用于将一些数据封装到java对象中的工具类; 名词:javaBean:特定格式的java类称为java ...
- 二维码工具类 - QrcodeUtils.java
二维码工具类,提供多种生成二维码.解析二维码的方法,包括中间logo的二维码等方法. 源码如下:(点击下载 - QrcodeUtils.java.MatrixToImageWriterEx.java. ...
- Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils
Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils Spring 系列目录(https://www.cnblogs.com/binary ...
- 并发编程(二)concurrent 工具类
并发编程(二)concurrent 工具类 一.CountDownLatch 经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作. import java.util.concurren ...
- java二维码工具类,中间带LOGO的,很强大
jar包下载maven 配置: Xml代码 收藏代码 <dependency> <groupId>com.google.zxing</groupId> <ar ...
- Java使用Zxing生成、解析二维码工具类
Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2). ...
- JavaWeb 之 BeanUtils 工具类
在上一个用户登录案例中,当从浏览器接收参数后,还需要创建 JavaBean 类,对其的属性每一项赋值,如果属性少,可以手动完成,但是当属性非常多,这时就发现非常不方便,在这里提供一个可以封装 Java ...
随机推荐
- Identifiers
Identifier An identifier is an arbitrarily long sequence of digits, underscores, lowercase and upper ...
- [Swust OJ 188]--异面空间(读懂题意很重要)
题目链接:http://acm.swust.edu.cn/problem/188/ Time limit(ms): 1000 Memory limit(kb): 65535 江鸟来到了一个很奇怪的 ...
- Python之路Day10
本节主要内容:memcache&redis.RabbitMQ.twisted框架 1. memcache&redis 1.1 memcache Memcached 是一个高性能的分布式 ...
- Windows Azure 网站开发Stacks支持
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Daria Grigoriu 和 Windows Azure 网站开发人员体验合作伙伴共同撰写. Windows Azure 网 ...
- vnc server配置、启动、重启与连接,图形管理linux系统
环境:RedHat Linux 5企业版.Xwindows:gnome (红帽默认安装的图形界面) 尽管我们可以使用SSH连接远程通过字符界面来操作Linux,但是对于更多熟悉图形人来说是很不方便的, ...
- 详解iOS7升级细节:引领视觉革命
下星期我们将看到的正式版将和WWDC上看到的大不相同.苹果六月份发布了全新版本的iOS操作系统——这是从2007年首次发布以来的最大的一次调整和改进.这次的改变招致许多批评.许多设计师在网站上晒出了他 ...
- Global文件(修正篇)
什么是Global文件 Global.asax文件俗称为一个类,继承于Httpapplication类.位于应用程序根目录下.也可称为应用程序文件. 概述: Global文件是可选的,一般在创建应用程 ...
- [转载]IOS项目打包除去NSLog和NSAssert处理之阿堂教程
原文链接地址:http://blog.sina.com.cn/s/blog_81136c2d0102v1ck.html 原文地址:IOS项目打包除去NSLog和NSAssert处理之阿堂教程作者:时空 ...
- python几个特别函数map filter reduce lambda
lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x): return x**2 print f(4) Python中使用lambda的话,写成这样 g = l ...
- Android Mediaplayer 调用release()的时候ANR
先stop,然后再release,最后吧media置为null