内省(二)之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 ...
随机推荐
- video.js的使用
跨浏览器地播放视频,在网上找了一下,找到了video.js,记录一下video.js的简单用法. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...
- Java网络蜘蛛/网络爬虫 Spiderman
Spiderman - 又一个Java网络蜘蛛/爬虫 Spiderman 是一个基于微内核+插件式架构的网络蜘蛛,它的目标是通过简单的方法就能将复杂的目标网页信息抓取并解析为自己所需要的业务数据. 主 ...
- DSP连接不上CCS3.3的问题讨论
环境 操作系统:Win7, 64bit IDE:CCS V3.3 仿真器:SEED XDS510PLUS DSP型号:TMS320C6713GDP(DSP6713) 检查步骤 试着按下复位按键后再点击 ...
- Mysql 启动失败 报错 1067
Mysql装好后,重启电脑第二次发现服务无法启动.提示如下: ------------------------ MySQL 服务无法启动. 系统出错. 发生系统错误 1067. 进程意外终止. --- ...
- Storm 配置图文解析
Storm 配置图文解析 參考阅读:http://www.xiaofateng.com/? p=959 ============================== | sample-topology ...
- C Primer Plus 读书笔记之C基础回顾
目标代码文件.可执行文件和库 C编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码.C分两步完成这一工作:编译和链接.编译器将源代码转换为中间代码,链接器将此中间代 ...
- awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 ...
- java--局部类只能访问外包方法的final局部成员
class B523{ // private int k = 10; public void go(int x, final int y){ // int a = x+y; final int b = ...
- linux系统文件属性-硬连接、软连接
1 硬链接概念 硬链接是指通过索引节点(Inode)来进行链接,在Linux(ext2,ext3)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(In ...
- 修改VISUAL STUDIO EXPRESS 2012新建C++文件编码
本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供markdown格式源码,欢迎使 ...