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,主要是爲了簡化反射的操作。