文档库 最新最全的文档下载
当前位置:文档库 › beanutils的中文API

beanutils的中文API

beanutils的中文API
beanutils的中文API

commons-beanutils学习报告

1. 概述

commons-beanutil开源库是apache组织的一个基础的开源库,为apache中许多类提供工具方法,学习它是学习其他开源库实现的基础。

Commons-beanutil中包含大量和JavaBean操作有关的工具方法,使用它可以轻松利用Java反射机制来完成代码中所需要的功能,而不需要详细研究反射的原理和使用,同时,该类库中提出了动态Bean的概念,不但提供现有JavaBean的所有功能,而且还可以在运行时动态的对Bean中的属性数据类型进行修改以及增删属性。

本文研究的是v1.7版本的commons-utils类库。

2. 转换器

2.1.概述

转换器用来将输入数据转换成需要的数据类型,同时提供统一的接口,方便客户代码使用和扩展。

Commons-beanutils包中,所有转换器都从https://www.wendangku.net/doc/0814896002.html,mons.beanutils.Converter接口集成,添加自己需要的实现。

转换器分为以下三个部分:

●数组转换器

●普通转换器

●地区敏感的转换器

●转换器工具类

Converter子类包含的都是转换器的实现,一般情况下,不需要直接实例化这些类,只需要使用ConvertUtil 中convert方法,就可以进行数据类型的转换。高级用户不但可以使用默认的转换方式,还可以向ConvertUtils 中注册新的或替代原有的转换器,实现需要的业务逻辑。

2.2.转换器接口

2.3.数组转换器

2.3.1.概述

数组转换器的实现被封装在https://www.wendangku.net/doc/0814896002.html,mons.beanutils.converters包中。它的功能是将一定格式的输入字符串转换成不同类型的数组,输入数据以逗号分隔,开头和结尾可以用大括号括起来,例如:“{1, 2, 3, 4,

5}”。

所有数组转换器实现都从一个名为AbstractArrayConverter的抽象基类中集成,这个类提供了解析输入字符串的工具方法。

2.3.2.类说明

2.3.3.类图

以上类构成了如下的类结构图:

2.3.4.小结

通过阅读数组转换器的代码,发现代码存在以下问题:

1.代码冗余:代码不够简洁,每个类中都或多或少的存在代码复制粘贴的痕迹。

2.部分类的类型转换时存在缺陷,不能正常转换。

2.4.普通转换器

2.4.1.概述

普通转换器提供了将字符串转换成Java中的数字、时间日期类型和其他类型对象的方法。

普通转换器都直接从Converter接口集成,实现其中的抽象方法。

用户不但可以直接使用这些工具方法,也可以自己实现一些特殊业务需求的转换器,只要实现Converter接口即可。

2.4.2.类说明

2.4.

3.类图

通用转换器的类结构图如下:

2.4.4.小结

通用转换器存在的问题是:

对于默认值的校验不到位,没有针对具体Converter的类型进行校验,一旦转换失败,直接返回默认值后可能导致后续代码出现ClassCastException,没有从源头杜绝这种情况发生,虽然这样设计更加灵活,但弊大于利,最好是在类创建时进行校验。

2.5.地区敏感转换器

2.5.1.概述

地区敏感转换器都被封装在https://www.wendangku.net/doc/0814896002.html,mons.beanutils.locale和

https://www.wendangku.net/doc/0814896002.html,mons.beanutils.locale.converters包中,前者提供一个集成自Converter的通用接口,后者提供这个接口的具体实现。

地区敏感转换器主要实现了当需要分地区进行转换时,需要进行的操作。主要功能是将带有不同地区特征的字符串转换成数字和时间日期类型对象。

2.5.2.类说明

2.5.

3.类图

地区敏感转换器的类图如下:

2.5.4.小结

地区敏感转换器中所有参数参数都是直接从构造函数中输入的,没有get和set,代码冗余度很大,需要重构。

2.6.转换器工具类

2.7.转换器总结

转换器这一套代码中实现了字符串向Java中各种数据类型的转换,这样在转换数据类型时不需要了解各种数据类型的转换API,只需要知道Converter接口即可,方便了开发人员编写代码。

但这套代码也有很多不足,其中最大的就是代码冗余的问题,小到函数内部的实现,大到整个的类结构,或多或少的都存在代码复制粘贴的影子,可以通过重构让代码变得更加清晰。

3. 动态bean

3.1.概述

我们知道,每一个JavaBean对象中包含一个Class对象,这个对象是单实例的并且在当前类加载器中全局唯一,由JVM维护,用来存储Bean中的属性描述信息,这些信息在运行时无法修改。

动态bean符合JavaBean架构的基本思想,每一个DynaBean实例有一个DynaClass对象,这个对象在同类DynaBean中唯一,但可以动态的对属性进行增删改的操作。这样就弥补了原来JavaBean架构中当Bean定义后不能对Bean中属性进行扩展的缺点,同时,提供了对bean中属性进行get/set的统一工具类,这些工具类的接口可以兼容动态Bean、标准Bean,以及映射(map)。

3.2.动态Bean属性

3.3.动态Bean的Class对象

3.3.1.概述

3.3.2.类说明

3.3.3.类图

上述类之间的关系如下:

3.4.动态Bean

3.4.1.概述

3.4.2.类说明

3.4.3.类图

DynaBean相关类之间关系如下:

4. 工具类

4.1.概述

和任何成熟的开源包一样,commons-beanutils作为一个工具包,提供了对JavaBean以及动态Bean进行操作的工具类,即使没有使用动态Bean,仍然可以放心的使用这些工具类。

常用的工具类有以下几个部分:

●PropertyUtils:对JavaBean中的属性值进行操作。

●MethodUtils:使用反射的方式请求bean中的方法。

●ConstructorUtils:使用反射的方式构造Bean的新实例。

●BeanUtils:对JavaBean提供拷贝,赋值等操作。

●LocaleBeanUtils:和BeanUtils功能类似,但还可以提供地区敏感数据的操作。

●ContextClassLoaderLocal:为不同线程保存需要数据的工具类。

4.2.详细说明

4.3.PropertyUtilsBean的方法

5. 总结

Commons-beanutils是一款优秀的工具类库。不但提供了一种可以动态扩展属性的JavaBean,同时封装了Java的反射机制,使用者可以更加容易的对反射进行操作,而不需要了解那么多和反射相关的知识。

相关文档