Jakarta-Common-BeanUtils研究心得(1)[转载][1]

[入库:2005年8月19日] [更新:2007年3月25日]

本文简介:选择自 morgan0916 的 blog

作者: sonymusic         2003.05.13

一、概述
第一次看到beanutils包,是在struts项目中,作为struts一个工具来使用的,
估计功能越弄越强,就移到common项目中了吧。

beanutils一共有四个package:
org.apache.commons.beanutils
org.apache.commons.beanutils.converters
org.apache.commons.beanutils.locale
org.apache.commons.beanutils.locale.converters
后三个包主要是用于数据的转换,围绕着一个converter接口,该接口只有一个方法:
java.lang.object convert(java.lang.class type, java.lang.object value) ,
用于将一个value转换成另一个类型为type的object。在一些自动化的应用中应该会有用。
这里不作评论,以后有兴趣了,或者觉得有用了,再行研究。
这里只讲第一个包。

二、测试用的bean
在开始所有的测试之前,我写了一个简单的bean,以便于测试,代码如下:
package test.jakarta.commons.beanutils;

/**
 * @author sonymusic
 *
 */
public class month {
 private int value;
 private string name;
 private int[] days={11,22,33,44,55};

 public month(int v, string n){
   value=v;
   name=n;
 }
 
 /**
  * returns the name.
  * @return string
  */
 public string getname() {
   return name;
 }

 /**
  * returns the value.
  * @return int
  */
 public int getvalue() {
   return value;
 }

 /**
  * sets the name.
  * @param name the name to set
  */
 public void setname(string name) {
   this.name = name;
 }

 /**
  * sets the value.
  * @param value the value to set
  */
 public void setvalue(int value) {
   this.value = value;
 }

 /**
  * @see java.lang.object#tostring()
  */
 public string tostring() {
   return value+"("+name+")";
 }

 public int[] getdays() {
   return days;
 }

 public void setdays(int[] is) {
   days = is;
 }

}

三、beanutils
这是一个主要应用于bean的util(呵呵,这个解释很绝吧),以下是其中几个方法的例子

//static java.util.map describe(java.lang.object bean)
//这个方法返回一个object中所有的可读属性,并将属性名/属性值放入一个map中,另外还有
//一个名为class的属性,属性值是object的类名,事实上class是java.lang.object的一个属性
 month month=new month(1, "jan");
 
 try {
   map map=beanutils.describe(month);
   set keyset=map.keyset();
   for (iterator iter = keyset.iterator(); iter.hasnext();) {
     object element = (object) iter.next();
     system.out.println("keyclass:"+element.getclass().getname());
     system.out.println("valueclass:"+map.get(element).getclass().getname());
     system.out.print(element+"\t");
     system.out.print(map.get(element));
     system.out.println();
   }
 } catch (illegalaccessexception e) {
   e.printstacktrace();
 } catch (invocationtargetexception e) {
   e.printstacktrace();
 } catch (nosuchmethodexception e) {
   e.printstacktrace();
 }
输出为:
keyclass:java.lang.string
valueclass:java.lang.string
value  1
keyclass:java.lang.string
valueclass:java.lang.string
class  class test.jakarta.commons.beanutils.month
keyclass:java.lang.string
valueclass:java.lang.string
name  jan
注意到所有map中的key/value都是string,而不管object中实际的值是多少。
与此对应的还有static void populate(java.lang.object bean, java.util.map properties)
用于将刚才describe出的map再装配成一个对象。


再看这样一段代码
曹晓钢也许还记得,为了取一个不确定对象的property,着实花了不少时间,
难度不大,但要做到100%的正确,仍然需要付出很大的精力。
//static java.lang.string getproperty(java.lang.object bean, java.lang.string name)
 month month=new month(1, "jan");
 
 try {
   system.out.println(beanutils.getproperty(month,"value"));
 } catch (exception e) {
   e.printstacktrace();
 }
//输出是:1

与getproperty类似的还有getindexedproperty, getmappedproperty,
以getindexedproperty为例:
 month month=new month(1, "jan");
 
 try {
   system.out.println(beanutils.getindexedproperty(month,"days",1));
   system.out.println(beanutils.getindexedproperty(month,"days[1]"));
 } catch (exception e) {
   e.printstacktrace();
 }
这两个调用是相同的。


beanutils中还有一个方法:
static void copyproperties(java.lang.object dest, java.lang.object orig)
它真是太有用,还记得struts中满天飞的都是copyproperties,我甚至怀疑整个beanutils最初
是不是因为这个方法的需求才写出来的。
它将对象orig中的属性复制到dest中去。


四、propertyutils
这个类和beanutils类很多的方法在参数上都是相同的,但返回值不同。
beanutils着重于"bean",返回值通常是string,而propertyutils着重于属性,
它的返回值通常是object。


五、constructorutils
这个类中的方法主要分成两种,一种是得到构造方法,一种是创建对象。
事实上多数时候得到构造方法的目的就是创建对象,这里只介绍一下创建对象。
//static java.lang.object constructorutils.invokeconstructor

本文关键:Jakarta-Common-BeanUtils研究心得(1)[转载]
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top