Commons-Beanutils包详解
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
Commons-Beanutils包详解的更多相关文章
- 常见 jar包详解
常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...
- Spring 3.x jar 包详解 与 依赖关系
以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...
- Spring 3.x jar 包详解 与 依赖关系(转)
以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...
- Spring各个jar包详解
Spring各jar包详解 spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar,aspects.jar, spring-portlet.jar, and sprin ...
- spring-jar包详解整理(大合集)
转:https://blog.csdn.net/weisong530624687/article/details/50888094 spring.jar 是包含有完整发布模块的单个jar 包.但是不包 ...
- Spring jar包详解
Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...
- Spring——jar包详解(转)
Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...
- 2.TCP_IP互联线缆_TCP_UDP报文抓包详解
TCP_IP互联线缆_TCP_UDP报文抓包详解 2.1网线标准 直通线 交叉线 异种设备互联使用直通线 同种设备互联使用交叉线 TCP和UDP 端口寻址 TCP数据格式 TCP三次握手 UDP数据格 ...
- 一篇关于apache commons类库的详解
1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...
- TCP通讯处理粘包详解
TCP通讯处理粘包详解 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据.TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的 ...
随机推荐
- Mongoose 是什么?
Mongoose 参考手册 标签(空格分隔): MongoDB 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据库的接口. Schema 一 ...
- cmd命令行中的errorlevel和延迟赋值
最近用到了命令行,一点心得: 1.errorlevel返回的确实是上一条命令的返回值,但不同命令的表现完全不同.比如: dir echo %errorlevel% //显示0 dir aldkalf ...
- LibSVM使用指南
LibSVM使用指南 一. SVM简介 在进行下面的内容时我们认为你已经具备了数据挖掘的基础知识. SVM是新近出现的强大的数据挖掘工具,它在文本分类.手写文字识别.图像分类.生物序列分析等实 ...
- HDU 5382 莫比乌斯反演
题目大意: 求S(n)的值 n<=1000000 这是官方题解给出的推导过程,orz,按这上面说的来写,就不难了 这里需要思考的就是G(n)这个如何利用积性函数的性质线性筛出来 作为一个质数,那 ...
- 解决 “fatal error C1083: ”无法打开包括文件
添加该项目的附加路径 . 1)右键查看该项目的属性 2)点击配置属性——〉 C/C++ ——〉 常规 ——〉 附加包含目录——〉将缺失文件所在目录添加进去
- 谁说固态硬盘没容量?4TB诞生、明年8TB!
固态硬盘已经逐渐取代机械硬盘成为很多用户的首选,但唯一欠缺的就是容量,或者说单位容量的价格,但是如今,机械硬盘的容量提升举步维艰,固态硬盘却在突飞猛进. 近日,SanDisk就宣布了全球第一款容量高达 ...
- 分享我设计的iOS项目目录结构
公司新项目就要着手研发了,希望能为这个项目多准备点知识.回想自己做过的项目,目录结构的划分总不如我的心意,有些目录命名不规范导致表达不明确,有些目录因为不具有代表性,导致在实际中不能充分发挥作用,导致 ...
- Quartz 2D--长方形和线条绘图
今天原本想模仿2048 游戏的. 但是在设计背景环境时,涉及到绘图的知识!于是就开始对绘图进行了一翻学习. 若想自己绘图必须 写自己的View(继承UICView):然后重写UIView 中的 dra ...
- <转>用thinkPHP实现验证码的功能
许多系统的登录都有验证码,而如果使用thinkPHP框架搭建网站的话,验证码的生成和验证就比较容易了 1.生成验证码 thinkPHP有对应生成验证码的方法 要使用验证码,需要导入扩展类库中的ORG. ...
- 《day18_String练习_基本类型包装类_集合入门》
package cn.itcast.api.String.test; public class StringTest_1 { public static void main(String[] args ...