1 概述
大多数Java开发人员习惯于创建符合属性getter和setter的JavaBeans命名模式的Java类。通过调用getXxx和setXxx方法获取java内部属性 。但是,在某些情况下,需要动态访问Java对象属性,此时就需使用反射或者内省机制,在运行时获取类信息,针对beanutils的使用场景如下:
- 构建与Java对象模型(例如Bean Scripting Framework)交互的脚本语言。
- 构建用于Web演示和类似用途的模板语言处理器(例如JSP或Velocity)。
- 为JSP和XSP环境构建自定义标记库(例如Jakarta Taglibs,Struts,Cocoon)。
- 使用基于XML的配置资源(例如Ant构建脚本,Web应用程序部署描述符,Tomcat的server.xml 文件)。
Java语言提供了反射和内省的机制,来弥补java的动态性,(具体请参考java.lang.reflect和java.beans包)。但是,这些API可能非常复杂,无法便捷的使用,该 BeanUtils的组件提供围绕这些功能易于使用的包装,总结起来就是beanutils包作为工具类利用反射和内省的原理,可以简化javabean的动态操作。
2 依赖模块
BeanUtils的1.7.x和1.8.x版本分发了三个版本:
- commons-beanutils.jar - 包含所有内容
- commons-beanutils-core.jar - 排除Bean Collections类
- commons-beanutils-bean-collections.jar - 仅限Bean Collections类
但是最新版本1.9.x的jar已经进行了合并,只对外提供一个jar。
3 核心子包
Commons BeanUtils一共包括如下5个包:
- org.apache.commons.beanutils – 核心包,定义一组工具类和需要用到的接口规范。
核心接口5个:
其中Converter是所有转化器的顶层接口,BeanInstrospector和InstrospectionContext主要负责内省相关,DynaBean和DynaClass是所有动态操作的接口。除此之外还有一个队属性抽象的接口DynaProperty。
- org.apache.commons.beanutils.converters – 转换String到需要类型的类,实现Converter接口
- org.apache.commons.beanutils.locale – beanutils的本地化操作
- org.apache.commons.beanutils.locale.converters – converters的locale本地化操作,主要针对基本数据类型,还包括时间的本地化操作等
- org.apache.commons.beantuils.expression – 使用到的Collection类
后三个包主要是用于数据的转换,围绕着一个 Converter 接口,该接口只有一个方法:java.lang.Object convert(java.lang.Class type, java.lang.Object value) ,用于将一个 value 转换成另一个类型为 type 的 Object。在将字符串类型的数据转换成日期类型时会使用此方法。
方法摘要:
返回值 | 方法名 | 说明 |
---|---|---|
static Object | cloneBean(Object bean) | 克隆对象 |
static void | copyProperties(Object dest, Object orig) | 复制属性 |
static void | copyProperty(Object bean, String name, Object value) | 复制属性 |
static <K,V> Map<K,V> | createCache() | 创建缓存 |
static Map<String,String> | describe(Object bean) | 描述 |
static String[] | getArrayProperty(Object bean, String name) | 返回指定属性的值,作为字符串数组返回 |
static String | getIndexedProperty(Object bean, String name) | 获取指定索引位置对象作为字符串返回 |
static String | getIndexedProperty(Object bean, String name, int index) | 获取指定索引位置对象作为字符串返回 |
static String | getMappedProperty(Object bean, String name) | 获得Map属性值作为字符串返回 |
static String | getMappedProperty(Object bean, String name, String key) | 获得Map属性中指定键的值作为字符串返回 |
static String | getNestedProperty(Object bean, String name) | 获得嵌套属性作为字符串返回 |
static String | getProperty(Object bean, String name) | 获得属性值作为字符串返回 |
static String | getSimpleProperty(Object bean, String name) | 获得属性值作为字符串返回 |
static void | populate(Object bean, Map<String,? extends Object> properties) | 将Map中的数据注入到Bean对象中 |
static void | setProperty(Object bean, String name, Object value) | 设置属性值 |
与之相关联的还有MethodUtils,ConstructorUtils,PropertyUtils,主要是为了简化反射的操作。