Apache Commons beanutils使用

本文介绍了Apache Commons BeanUtils库的使用方法,包括Bean的克隆、Map与Bean之间的转换等高级特性。BeanUtils简化了JavaBean操作,适用于动态属性访问场景。

Apache Commons beanutils使用

Commons BeanUtils下载,并可以查看对应的文档。

BeanUtils也是Apache Commons家族中的一员,顾名思义,它是用来对Java Bean来进行处理的。一般情况下,在写一个Bean时,我们都要写上getXXsetXX方法,这样在读取和写入对象属性值时很方便,但有些场合下,比如动态访问Java对象属性时,上面的写法就不合适了。

以下内容大致翻译自Apache Commons Bean Utils Tutorial

Apache Commons Bean Utils Tutorial

例如,有个名为PersonJavaBean,有两个域namephone

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);
  }

BeanUtilsAPI中有一个BUG,假设bean有一个field以A_**开头,如果调用BeanUtils.getProperty()方法,就会抛出一个java.lang.NoSuchMethodException: Unknown property ‘A_** on class ‘class Person异常。

其它文章

用法
1.克隆对象

Person person2 =  (Person)BeanUtils.cloneBean(person);
  1. 将一个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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值