首页 > Java > 工具篇 > BeanUtils(内省操作)
2014
08-18

BeanUtils(内省操作)

BeanUtils(内省操作)16

内省操作用于操作JavaBean的属性(setter、getter方法),关于内省和JavaBean的基础知识参考:高新技术(四) 反射

1、Sun提供的内省操作(java.beans.*包)

Sun在JDK中提供了一个java.beans.*包,常见API如下:

BeanUtils(内省操作)226

利用java.beans.*中的API操作JavaBean中的属性有下面两种方式:

① 通过Introspector类获得bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。

② 通过PropertyDescriptor类操作Bean的属性

以上两种内省操作在高新技术(四) 反射中都有提及。

2、Apache提供的内省操作(BeanUtils)

Sun公司的内省API用起来过于繁琐,所以Apache结合很多实际开发中的应用场景提供了一套简单、易用的API操作JavaBean的属性,即BeanUtils。

使用BeanUtils时需要导入两个jar包:commons-beanutils、commons-logging。BeanUtils工具包依赖于commons-logging的jar包。

下面结合实际的案例演示BeanUtils的使用:

1)利用BeanUtils工具操作属性(setProperty(),getProperty())

@Test
public void test1() throws Exception {
	Student s = new Student();
	//设置属性
	BeanUtils.setProperty(s, "name", "flyne");

	//获取属性:getProperty方法的返回值被设计成了String类型(☆)
	//这是因为用户的输入和看到的结果都是字符串
	String name = BeanUtils.getProperty(s, "name");
	System.out.println(name);
}

2)在setProperty时,BeanUtils可以进行类型的自动转换:本来需要的是int,给个字符串,也OK。但是转换也有局限性:它仅限于基本类型。

@Test
public void test2() throws Exception{
	Student s = new Student();
	//属性值为基本类型时,可自动从字符串转换(用户的输入都是字符串)
	BeanUtils.setProperty(s, "age", "24");

	String age = BeanUtils.getProperty(s, "age");
	System.out.println(age);
}

3)当属性值类型为非基本类型时,需要用ConvertUtils.register(Converter converter,Class clazz)为指定的目标类型注册一个转换器(Converter)。
Converter是一个接口,接口中有个抽象方法:convert(Class type,Object value),用户要自定义一个转换器时,需实现Converter接口。
下面的例子演示了怎么自定义一个Converter,实现从字符串类型到日期类型的转换。

@Test
public void test3() throws Exception{
	Student s = new Student();
	//注册类型转换器:自定义了一个Convert,字符串<-->Date
	ConvertUtils.register(new Converter(){
		@Override
		public Object convert(Class type, Object value) {
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

			if(value instanceof String){
				//字符串转换为Date
				String v = (String)value;
				try {
					return df.parse(v);
				} catch (ParseException e) {
					throw new RuntimeException(e);
				}
			}else{
				//Date转换为String(用的少)
				Date d = (Date)value;
				return df.format(d);
			}
		}
	}, Date.class);
	BeanUtils.setProperty(s, "birthday", "1990-11-14");

	String birthday = BeanUtils.getProperty(s, "birthday");
	System.out.println(birthday);
}

4)BeanUtils工具中也提供了不少Converter接口的实现类,完成字符串到各种类型的转换。

@Test
public void test4() throws Exception{
	Student s = new Student();
	//注册类型转换器:自定义了一个Convert,字符串<-->Date
	ConvertUtils.register(new DateLocaleConverter(), Date.class);
	BeanUtils.setProperty(s, "birthday", "1990-11-14");

	String birthday = BeanUtils.getProperty(s, "birthday");
	System.out.println(birthday);
}

5)BeanUtils将Map类型的对象自动封装到JavaBean中(☆ 很重要,在封装表单中提交的数据时相当有用!)

@Test
public void test5() throws Exception{
	Map<String,String> map = new HashMap<String,String>();
	//前提:Map的key必须要与Bean的属性一致。
	map.put("name", "flyne");
	map.put("age", "24");
	map.put("birthday", "1990-11-14");

	Student s = new Student();
	System.out.println("封装之前:"+s);
	ConvertUtils.register(new DateLocaleConverter(), Date.class);
	BeanUtils.populate(s,map);
	System.out.println("封装之后"+s);
}

留下一个回复

你的email不会被公开。