PropertyUtils嵌套属性的使用
一般情況下,在Java中你可以通過(guò)get方法輕松獲取beans中的屬性值。但是,當(dāng)你事先不知道beans的類(lèi)型或者將要訪問(wèn)或修改的屬性名時(shí),該怎么辦?Java語(yǔ)言中提供了一些像java.beans.Introspector這 樣類(lèi),實(shí)現(xiàn)了在運(yùn)行時(shí)檢測(cè)Java類(lèi)并確定屬性get和set方法的名稱(chēng),結(jié)合Java中的反射機(jī)制就可以調(diào)用這些方法了。然而,這些APIs使用起來(lái)比 較困難,并且將Java類(lèi)中一些不必要的底層結(jié)構(gòu)暴露給了開(kāi)發(fā)人員。BeanUtils包中的APIs試圖簡(jiǎn)化動(dòng)態(tài)獲取和設(shè)置bean屬性的過(guò)程。
BeanUtils包中的PropertyUtils類(lèi)中的一些靜態(tài)方法實(shí)現(xiàn)了上面的功能,稍后會(huì)詳細(xì)介紹。首先,介紹一些有用的定義:
JavaBean支持的屬性類(lèi)型一般可以劃分成三類(lèi)–標(biāo)準(zhǔn)的JavaBeans規(guī)范支持其中的一些,也有一部分只有BeanUtils包支持:
-
Simple(單值) – 單值或量,有個(gè)一可以訪問(wèn)或修改的屬性。值的類(lèi)型可能是Java語(yǔ)言的原生類(lèi)型(如:int型),簡(jiǎn)單的類(lèi)(如:java.lang.String),或 者一個(gè)復(fù)雜類(lèi)的對(duì)象,這個(gè)類(lèi)可能來(lái)自Java語(yǔ)言或者來(lái)自應(yīng)用程序再或者來(lái)自應(yīng)用程序中的一個(gè)類(lèi)庫(kù)。
-
Indexed(索 引) – 索引的屬性,屬性中存放有序?qū)ο?#xff08;都是同類(lèi)型的)的集合,每個(gè)對(duì)象都可以通過(guò)一個(gè)非負(fù)的整數(shù)值(或下標(biāo))來(lái)獲取。另外,所有值的集合可以使用一個(gè)數(shù)組來(lái)設(shè) 置或者獲取。作為一個(gè)JavaBeans規(guī)范的擴(kuò)展,BeanUtils包認(rèn)為所有底層數(shù)據(jù)類(lèi)型為java.util.List(或List的一個(gè)實(shí)現(xiàn)) 的屬性都可以被索引。
-
Mapped(映射) – 作為一個(gè)標(biāo)準(zhǔn)JavaBeans APIs的擴(kuò)展, BeanUtils包認(rèn)為所有底層數(shù)據(jù)類(lèi)型為java.util.Map的屬性都可以被"映射"。你可以通過(guò)String類(lèi)型的key值來(lái)設(shè)置或者獲取對(duì)應(yīng)的值。
PropertyUtils類(lèi)中提供了各種API方法用來(lái)獲取和設(shè)置上述三種類(lèi)型的屬性。在下面的程序片段中,假設(shè)在bean類(lèi)中都定義了如下的方法:
訪問(wèn)基本屬性
獲取和設(shè)置simple屬性很簡(jiǎn)單。在Javadocs中查看下面兩個(gè)方法:
-
PropertyUtils.getSimpleProperty(Object bean, String name)
-
PropertyUtils.setSimpleProperty(Object bean, String name, Object value)
使用這兩個(gè)方法,你可以動(dòng)態(tài)地修改employee的name屬性:
?
Employee employee = ...; String firstName = (String) PropertyUtils.getSimpleProperty(employee, "firstName"); String lastName = (String) PropertyUtils.getSimpleProperty(employee, "lastName"); ... manipulate the values ... PropertyUtils.setSimpleProperty(employee, "firstName", firstName); PropertyUtils.setSimpleProperty(employee, "lastName", lastName);對(duì)于indexed(索引)屬性,你有兩種選擇 - 你既可以在屬性名后面添加方括號(hào)在里面放上一個(gè)下標(biāo),也可以在調(diào)用方法時(shí)將其作為一個(gè)獨(dú)立參數(shù):
-
PropertyUtils.getIndexedProperty(Object bean, String name)
-
PropertyUtils.getIndexedProperty(Object bean, String name, int index)
-
PropertyUtils.setIndexedProperty(Object bean, String name, Object value)
-
PropertyUtils.setIndexedProperty(Object bean, String name, int index, Object value)
屬性名的下標(biāo)只能是整數(shù)常量。如果你想獲取的項(xiàng)的索引是計(jì)算出來(lái)的,你可以將屬性名和索引作為字符串組合起來(lái)。例如,你可以向下面這樣做:
類(lèi)似的,獲取和設(shè)置mapped(映射)屬性的方法同樣有兩對(duì)。與indexed(索引)不同的是額外的屬性是用括號(hào)括起來(lái)的(“(”和“)”)而不是方括號(hào),并且獲取和設(shè)置值時(shí)如同從底層的map中獲取和設(shè)置值一樣。
-
PropertyUtils.getMappedProperty(Object bean, String name)
-
PropertyUtils.getMappedProperty(Object bean, String name, String key)
-
PropertyUtils.setMappedProperty(Object bean, String name, Object value)
-
PropertyUtils.setMappedProperty(Object bean, String name, String key, Object value)
例如,你可以使用下面兩種方法設(shè)置employee的家庭住址:
訪問(wèn)嵌套屬性
在上面的例子中,我們假設(shè)你將bean作為第一個(gè)參數(shù)傳入PropertyUtils方法,并希望獲取指定屬性的值。然而,如果屬性的值是一個(gè)Java對(duì)象,并且你希望進(jìn)一步獲取這個(gè)Java對(duì)象的某個(gè)屬性的值?
例如,假設(shè)你事實(shí)上想要獲取的值是employee家庭住址中的city屬性。使用標(biāo)準(zhǔn)的Java編程技術(shù)直接獲取bean的對(duì)應(yīng)屬性,你可以這樣寫(xiě):
String city = employee.getAddress(“home”).getCity();
使用PropertyUtils類(lèi)中的等效機(jī)制被稱(chēng)為嵌套屬性訪問(wèn)。使用這種方法,你將訪問(wèn)路徑上的屬性的名稱(chēng)用“.”拼接起來(lái) – 與你在JavaScript執(zhí)行嵌套屬性訪問(wèn)的方式非常相似。
-
PropertyUtils.getNestedProperty(Object bean, String name)
-
PropertyUtils.setNestedProperty(Object bean, String name, Object value)
PropertyUtils中等效于上面的Java代碼將是這樣:
String city = (String) PropertyUtils.getNestedProperty(employee, “address(home).city”);
最后,方便起見(jiàn),PropertyUtils提供了如下一組方法,它們接收simple、indexed和mapped屬性的任意組合方法,支持任意層次的嵌套:
-
PropertyUtils.getProperty(Object bean, String name)
-
PropertyUtils.setProperty(Object bean, String name, Object value)
你可以像這樣使用:
總結(jié)
以上是生活随笔為你收集整理的PropertyUtils嵌套属性的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【娜家花园养花小记】
- 下一篇: C++在windows下获得运行主机的硬