Jakarta Commons项目提供了相当丰富的API,Commons下面还有相当数量的子项目,用于解决各种各样不同方向的实际问题,BeanUtils就是其中的一个,用于处理JavaBean。它利用Java的反射机制,从动态的生成对bean的getter和setter的调用代码,到模拟创建一个动态的bean,等等。这个包看似简单,却是很多开源项目的基石:如在著名的Struts和Spring Framework中,我们都能找到BeanUtils的影子。 BeanUtils最核心的好处在于:我们在编码时,并不需要知道处理的JavaBean具体是什么类型,有哪些属性,这些信息可以动态获取,甚至可以不必去关心事实上是否存在这样一个具体的JavaBean。我们只需要知道有一个JavaBean的实例,从中取得某个属性,设定某个属性的值,或者仅仅是需要一个属性表。要做到这些,依靠Sun提供的JavaBean规范似乎找不到一个很直接的方式,除非硬编码,将getXxxx()和setXxxx()直接写进我们的程序。但是这样就大大增加了代码的复杂度、耦合性和维护成本。

public class BeanUtilsTest {
  @Test
  public void test1() throws Exception {
    String name = "xxx";
    String age = "28";
    String birthday = "1980-09-07";
    // 为了日期赋到bean的birthday属性上,需注册一个日期转换器
    ConvertUtils.register(new Converter() {
      @Override
      public Object convert(Class type, Object value) {
          if (value == null) {
              return null;
          }
          if (!(value instanceof String)) {
              throw new ConversionException("只支持String类型的转换!");
          }
          String str = (String) value;
          if ("".equals(str.trim())) {
              return null;
          }
          SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
          try {
              return df.parse(str);
          } catch (ParseException e) {
              throw new RuntimeException(e); // 异常链不能掉
          }
      }

    }, Date.class);
    // 使用beanutils已实现的转换器(有时有bug,如String birthday = "";)
    // ConvertUtils.register(new DateLocaleConverter(), Date.class);
    Person person = new Person();
    BeanUtils.setProperty(person, "name", name);
    BeanUtils.setProperty(person, "age", age); // beanutils自动将String转换成int,只支持8中基本数据类型
    BeanUtils.setProperty(person, "birthday", birthday);
    System.out.println(person.getName() + ":" + person.getAge());
    System.out.println(person.getBirthday());
 }

 @Test
 public void test2() throws Exception {
   Map<String, String> map = new HashMap<String, String>();
   map.put("name", "xxx");
   map.put("age", "30");
   Person person = new Person();
   BeanUtils.populate(person, map); // 将map集合中的值填充bean的属性,map的key要与bean的属性一致
 }

}