日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中映射getproperty,PropertyUtils.getProperty和PropertyUtils.setProperty的用法详解

發布時間:2024/8/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中映射getproperty,PropertyUtils.getProperty和PropertyUtils.setProperty的用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

一般情況下,在Java中你可以通過get方法輕松獲取beans中的屬性值。但是,當你事先不知道beans的類型或者將要訪問或修改的屬性名時,該怎么辦?Java語言中提供了一些像java.beans.Introspector這樣類,實現了在運行時檢測Java類并確定屬性get和set方法的名稱,結合Java中的反射機制就可以調用這些方法了。然而,這些APIs使用起來比較困難,并且將Java類中一些不必要的底層結構暴露給了開發人員。BeanUtils包中的APIs試圖簡化動態獲取和設置bean屬性的過程。

BeanUtils包中的PropertyUtils類中的一些靜態方法實現了上面的功能,稍后會詳細介紹。首先,介紹一些有用的定義:

JavaBean支持的屬性類型一般可以劃分成三類--標準的JavaBeans規范支持其中的一些,也有一部分只有BeanUtils包支持:

Simple(單值)? --? 單值或量,有個一可以訪問或修改的屬性。值的類型可能是Java語言的原生類型(如:int型),簡單的類(如:java.lang.String),或者一個復雜類的對象,這個類可能來自Java語言或者來自應用程序再或者來自應用程序中的一個類庫。

Indexed(索引)? --?? 索引的屬性,屬性中存放有序對象(都是同類型的)的集合,每個對象都可以通過一個非負的整數值(或下標)來獲取。另外,所有值的集合可以使用一個數組來設置或者獲取。作為一個JavaBeans規范的擴展,BeanUtils包認為所有底層數據類型為java.util.List(或List的一個實現)的屬性都可以被索引。

Mapped(映射)? --? 作為一個標準JavaBeans APIs的擴展,? BeanUtils包認為所有底層數據類型為java.util.Map的屬性都可以被"映射"。你可以通過String類型的key值來設置或者獲取對應的值。

PropertyUtils類中提供了各種API方法用來獲取和設置上述三種類型的屬性。在下面的程序片段中,假設在bean類中都定義了如下的方法:

public?class?Employee?{

public?Address?getAddress(String?type);

public?void?setAddress(String?type,?Address?address);

public?Employee?getSubordinate(int?index);

public?void?setSubordinate(int?index,?Employee?subordinate);

public?String?getFirstName();

public?void?setFirstName(String?firstName);

public?String?getLastName();

public?void?setLastName(String?lastName);訪問基本屬性

獲取和設置simple屬性很簡單。在Javadocs中查看下面兩個方法:

PropertyUtils.getSimpleProperty(Object bean, String name)

PropertyUtils.setSimpleProperty(Object bean, String name, Object value)

使用這兩個方法,你可以動態地修改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);????? 對于indexed(索引)屬性,你有兩種選擇 - 你既可以在屬性名后面添加方括號在里面放上一個下標,也可以在調用方法時將其作為一個獨立參數:

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)

屬性名的下標只能是整數常量。如果你想獲取的項的索引是計算出來的,你可以將屬性名和索引作為字符串組合起來。例如,你可以向下面這樣做:

Employee?employee?=?...;

int?index?=?...;

String?name?=?"subordinate["?+?index?+?"]";

Employee?subordinate?=?(Employee)?PropertyUtils.getIndexedProperty(employee,?name);

Employee?employee?=?...;

int?index?=?...;

Employee?subordinate?=?(Employee)?PropertyUtils.getIndexedProperty(employee,?"subordinate",?index);????? 類似的,獲取和設置mapped(映射)屬性的方法同樣有兩對。與indexed(索引)不同的是額外的屬性是用括號括起來的(“(”和“)”)而不是方括號,并且獲取和設置值時如同從底層的map中獲取和設置值一樣。

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)

例如,你可以使用下面兩種方法設置employee的家庭住址:

Employee?employee?=?...;

Address?address?=?...;

PropertyUtils.setMappedProperty(employee,?"address(home)",?address);

Employee?employee?=?...;

Address?address?=?...;

PropertyUtils.setMappedProperty(employee,?"address",?"home",?address);訪問嵌套屬性

在上面的例子中,我們假設你將bean作為第一個參數傳入PropertyUtils方法,并希望獲取指定屬性的值。然而,如果屬性的值是一個Java對象,并且你希望進一步獲取這個Java對象的某個屬性的值?

例如,假設你事實上想要獲取的值是employee家庭住址中的city屬性。使用標準的Java編程技術直接獲取bean的對應屬性,你可以這樣寫:

String?city?=?employee.getAddress("home").getCity();????? 使用PropertyUtils類中的等效機制被稱為嵌套屬性訪問。使用這種方法,你將訪問路徑上的屬性的名稱用“.”拼接起來 --

與你在JavaScript執行嵌套屬性訪問的方式非常相似。

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");????? 最后,方便起見,PropertyUtils提供了如下一組方法,它們接收simple、indexed和mapped屬性的任意組合方法,支持任意層次的嵌套:

PropertyUtils.getProperty(Object bean, String name)

PropertyUtils.setProperty(Object bean, String name, Object value)

你可以像這樣使用:

Employee?employee?=?...;

String?city?=?(String)?PropertyUtils.getProperty(employee,?"subordinate[3].address(home).city");

總結

以上是生活随笔為你收集整理的java中映射getproperty,PropertyUtils.getProperty和PropertyUtils.setProperty的用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。