作者: 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