Apache Commons beanutils使用
在Commons BeanUtils下载,并可以查看对应的文档。
BeanUtils
也是Apache Commons家族中的一员,顾名思义,它是用来对Java Bean来进行处理的。一般情况下,在写一个Bean时,我们都要写上getXX
和setXX
方法,这样在读取和写入对象属性值时很方便,但有些场合下,比如动态访问Java对象属性时,上面的写法就不合适了。
以下内容大致翻译自Apache Commons Bean Utils Tutorial
Apache Commons Bean Utils Tutorial
例如,有个名为Person
的JavaBean
,有两个域name
和phone
public class Person {
private String name;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
创建Person
对象,设置域的值和获取域的值,如下:
/**
* Creating the Person object
*/
Person person = new Person();
/**
* setting the Values.
*/
person.setName("Codesuggestions");
person.setPhone("999-999-9999");
/**
* getting the Values.
*/
System.out.println("Person Name is::" + person.getName());
System.out.println("Person Phone is::" + person.getPhone());
现在假设我们不知道field的名称,而我们想设置值,可以通过反射API和BeanUtils
的API来实现
/**
* getting the Fields using Reflection API.
*/
Field[] fields = person.getClass().getDeclaredFields();
/**
* Settign the Values..
*/
for (Field field : fields) {
System.out.println("Field Name::" + field.getName());
if (field.getName().equalsIgnoreCase("name")) {
BeanUtils.setProperty(person, field.getName(), "codesuggestions");
} else {
BeanUtils.setProperty(person, field.getName(), "999-999-9999");
}
}
/**
* gettign the Values..
*/
for (Field field : fields) {
String property = BeanUtils.getProperty(person, field.getName());
System.out.println("Bean Values Using BeanUtils.getProperty()::" + property);
}
在BeanUtils
API中有一个BUG,假设bean有一个field以A_**
开头,如果调用BeanUtils.getProperty()
方法,就会抛出一个java.lang.NoSuchMethodException: Unknown property ‘A_** on class ‘class Person
异常。
其它文章
用法
1.克隆对象
Person person2 = (Person)BeanUtils.cloneBean(person);
- 将一个Map对象转化为一个Bean
首先这个Map对象的key必须与Bean的属性相对应,还是拿上面Person对象来说,有三个属性name,email,age,那么Map对象中也应当与此对应,如下:
Map map = new HashMap();
map.put(“name”,”tom”);
map.put(“email”,”tom@”);
map.put(“age”,”21”);
//将map转化为一个Person对象
Person person = new Person();
BeanUtils.populate(person,map);
通过上面的一行代码,此时person的属性就已经具有了上面所赋的值了。
那么什么情况下会应用到这种场景呢?如果你做过Web开发,你一定对这样的一个场景很熟悉,那就是我们总是要通过如下的代码来做一些事情:
String name = request.getParameter(“name”);
String age = request.getParameter(“age”);
person.setName(name);
person.setAge(age);
如果经常写的话,觉得很烦吧?这时你就可以应用上面BeanUtils的功能,你可以先得到各参数的名称及对应的值并放入到一个Map对象中,如下:
Enumeration params = request.getParameterNames();
while (params.hasMoreElements()){
String name = (String) params.nextElement();
map.put(name, request.getParameter(name));
}
然后再通过BeanUtils.populate(person,map);
将map转化为一个对象,这样看上去后是不是觉得相当简洁?而且特别是当参数很多的时候,比如提交了一个庞大的form表单时,这样就更显其强大与简洁!
既然可以将一个map对象转化为一个Bean,当然也可以将一个Bean转化为一个Map对象了,如下:
Map map = BeanUtils.describe(person);