commons-beanutils(一)
commons-beanutils 这个是jakarta commons项目中的一个子项目。这个项目开发的目的是帮助开发者动态的获取/设值java bean的属性,同时解决每次都要写getxxx和setxxx的麻烦。
一、xxxconvert
这些类都实现converter接口,提供把value值转化成为相应xxx类的实现。现在只针对四种类型:数字,时间,boolean和string。在converter 接口中只有一个方法convert(class type, object value),把value对象转换为type所要求的类。xxxconvert类中这个方法的思路是:
1、如果value==null,并且自己内部有缺省的值那么就返回这个缺省的值。如果没有缺省值,就抛出conversionexception异常。
2、如果value instanceof xxx类,那么就直接返回value。
3、如果上面的都不行,那么调用new xxx(value.tostring())或者xxx.valueof(value.tostring())方法来返回。转化失败时,抛出conversionexception异常。
二、特殊的实现
1、对于classconverter类,当进入第三种情形的时候,实际执行的是
classloader classloader =thread.currentthread().getcontextclassloader(); if (classloader == null) { classloader = classconverter.class.getclassloader(); } return (classloader.loadclass(value.tostring()));
2、对于booleanconverter类,当进入第三种情形的时候,实际执行的是,根据value.tostring()的值:yes,y,true, on, 1 返回true;no,n,false,off,0 返回false。如果这些情形都不符合,并且有缺省值的时候则返回缺省值。否则抛出conversionexception;
三、xxxarrayconverter
这些类继承自abstractarrayconverter类。 abstractarrayconverter 实际只实现了一个list parseelements(string svalue)方法。这个方法接受的是{value1, value2,...}格式的字符串,逐个解析出来后,放入一个arraylist中。它通过streamtokenizer解析字符串:streamtokenizer是用来分离input stream中读取的字符串,并且可以根据标记区分不同的内容,比如数字,字符或者注释。xxxarrayconverter由于要转换的是一个数组,所以convert(....)方法的实现过程有所不同。
1、如果value==null,并且自己内部有缺省的值那么就返回这个缺省的值。如果没有缺省值,就抛出conversionexception异常。
2、如果model.getclass() == value.getclass(),那么就直接返回value。
3、如果上面的都不行,那么就通过parseelements(value.tostring())生成一个数组,再对数组的元素逐个调用new xxx(list.get(i))或者xxx.valueof(list.get(i))方法,转换成为数组对元素要求的类型。转化失败时,抛出conversionexception异常。
commons-beanutils(二)
一、localeconverter 与 baselocaleconverter
localeconverter继承自 converter接口,定义了一个新方法convert(class type, object value, string pattern)。
抽象类baselocaleconverter实现了localeconverter接口。它的locpattern属性用来表示这个对象的pattern是否是本地化的格式。patttern 是指把何种格式的时间或者数字值转换成标准值。convert(...)的执行过程是:
1、如果value==null,并且自己内部有缺省的值那么就返回这个缺省的值。如果没有缺省值,就抛出conversionexception异常。
2、根据参数pattern值是否为null,调用parse(object value, string pattern)方法:如果这个参数不为null那么就使用这个参数的值,否则使用对象预存的pattern值。如果这
样做引起了异常,会首先判断是否能够返回缺省的值,不能则抛出conversionexception异常。
3、parse(object value, string
pattern)方法的实现被抛至继承了它的类具体实现。这个方法虽然把value值表述为object类型,但是最后都是通过强制转换,转换成为string类型。也就是说它实际上需要的
是string类型的value。
二、 xxxlocaleconverter
把pattern格式的value转换成标准格式的相应的xxx类。这些类可以分为两大类:一类为时间,一类为数值。
1、时间类最后都会通过simpledateformat类对值进行转换,程序如下:
if(pattern == null) { pattern = locpattern ? new simpledateformat().tolocalizedpattern() : new simpledateformat().topattern(); } simpledateformat format = new simpledateformat(pattern, locale); if (locpattern) { formatter.applylocalizedpattern(pattern); }else { formatter.applypattern(pattern); } return formatter.parse((string) value);
2、数值类最后都会通过decimalformat类对值进行转换,程序如下:
decimalformat formatter = (decimalformat) decimalformat.getinstance(locale); if (pattern != null) { if (locpattern) { formatter.applylocalizedpattern(pattern); } else { formatter.applypattern(pattern); } } return formatter.parse((string) value);
这个转化过程要注意精度的问题。由于number类是所有的数值类的父类,所以转换完成后要检查最后的结果是否是当前要求的精度:如果大于所要求的精度,则抛出conversionexception异常。
commons-beanutils(三)
dyna开头的类,是专门为dynaformbean而设计的。
一、dynabean,dynaclass 与 dynaproperty
dynabean并不是java中所定义的bean,而是一种“假”的bean。因为它并不是通过getxxx和setxxx方法,对xxx属性进行取值和设值的。它通过一个实现了dynaclass接口的类,帮助管理其所有的属性的类别,而自己则管理对xxx属性值的设定和获取。在设值的时候会通过与name对应的dynaproperty对象,检查赋值的类别是否正确。
dynaproperty类描述的是dynabean中所包含的属性的类型。dynaproperty类有三个属性:属性的名称:name,属性的名称;type,属性的类别;contenttype,如果dynaproperty描述的是个容器对象(list或者map),那么这个contenttype就代表这个容器内元素的类别。这个类值得关注的地方是writeobject和readobject方法的实现。它会首先判断自己的type是否是一个primitive的类,如果是,则先写入true标志,再写入对应的primitive类的编号;否则写入false标志,再写入type。因为在调用readobject方法时,如果得出的是primitive类型,则type的值为xxx.type而不是xxx.class。
dynaclass 是一个接口,用来管理dynabean中所有的dynaproperty属性。
二、basicedyanbean 与 basicdynaclass
basicedyanbean 实现自dynabean接口。它包含一个实现了dynaclass接口的类的对象,和一个用来存放值的hashmap。这个hashmap的key与dynaclass中hashmap的key是一一对应的。
basicdynaclass 实现了dynaclass接口,以dynaproperty的name为key保存所有这些dynaproperty对象。它通过newinstance方法动态生成实现了dynabean接口的类的对象;注意这个类是可以动态指定的,如果没有,那么就是默认的basicdynabean类。动态指定类是通过反射实现的,程序如下:
//dynabeanclass为任意的实现了dynabean接口的类,constructortypes为这个
//类的构造方法所需要的参数的类型
constructor = dynabeanclass.getconstructor(constructortypes);
//constructorvalues为构造方法的参数值,实际上它的值为当前的basicdynaclass
return ((dynabean) constructor.newinstance(constructorvalues));
commons-beanutils(四)
一、convertutils 和 convertutilsbean
convertutils 是convertutilsbean类的一个简单封装,即convertutils中的所有方法都是通过直接调用convertutilsbean中的同名方法实现的。如果你需要更复杂的功能,就使用convertutilsbean,否则使用convertutils。
convertutilsbean 通过一个hashmap管理所有的xxxconverter。这个hashmap的key为xxx的类全名,值为相应的xxxconverter对象。通过deregister()方法,初始化这个hashmap。这个初始化方法会为每一个xxxconverter类提供一个缺省的值。用户可以动过setdefaultxxx(...)方法来自行设置xxxconverter对象的缺省值。这个类还提供了convert(...)方法,对string value进行相应的转化。
二、propertyutils 和 propertyutilsbean
propertyutils 是propertyutilsbean类的一个简单封装,同样它的所有方法都是通过直接调用propertyutilsbean 中同名方法实现的。
propertyutilsbean 对dynabean或者一个java标准bean中的属性动态的赋值和取值(非通过getxxx和setxxx方法)。
1、这个类支持多层嵌套,比如:xxx[i].yyy(key).zzz,那么它会为你得到或者设置zzz的属性。
2、所有的set/get方法介绍:
//对xxx(key)格式的name设值
setmappedproperty(object bean, string name,string key, object value)
//对xxx[i]格式的name设值
setindexed
闽公网安备 35060202000074号