2016-11-26 24 views
3

我通過爲什麼PropertyDescriptor以大寫字母返回屬性名稱作爲第一個字符?

Introspector.getBeanInfo(this.getClass()).getPropertyDescriptors() 

獲取有關類的信息,然後通過調用propery[i].getName()獲取屬性的名稱。

如果一個屬性沒有一個字母部分,一切都很好。例如,如果某個物業的名稱爲personAddress(與此同時其獲取者/設置者 - >​​,setPersonAddress(String personAddress))是OK,getName()返回personAddress

但如果酒店有一個名字rPersonIdgetRPersonId()setRPersonId(Long rPersonId))然後getName()返回「RPersonId」,即第一個字母已經大寫!爲什麼?

根據https://docs.oracle.com/javase/7/docs/api/java/beans/FeatureDescriptor.html

public String getName() - >獲得此特性的編程名稱。

那麼爲什麼它會返回一個名字,它與其getter或setter的名稱有關,而不是屬性的真實名稱?

回答

0

因爲這是部分宗教。

做過Java Beans的人認爲,應該總是通過一對方法訪問屬性。所以你沒有得到數據成員的名字。您正在獲取只能通過方法訪問的屬性。

這是從文檔:

A PropertyDescriptor describes one property that a Java Bean exports 
via a pair of accessor methods. 

https://docs.oracle.com/javase/7/docs/api/java/beans/PropertyDescriptor.html

的理論是,你不應該使用的數據成員的名字,所以通過bean接口,他們不給你。

+0

答案並不能解釋爲什麼第一個字符是不是小寫。 – Tunaki

+0

謝謝你的迴應! –

+0

謝謝你的迴應! 該鏈接https://docs.oracle.com/javase/7/docs/api/java/beans/PropertyDescriptor.html說PropertyDescriptor有幾個構造函數。哪一個是通過調用getBeanInfo(this.getClass())。getPropertyDescriptors()來調用的? 它只是說,如果我自己創建一個PropertyDescriptor,那麼我必須提供一個getter/setter對 –

2

這實際上是記錄的行爲。

首先,屬性名稱完全通過發現它們的getter和setter來定位,而不是通過查看類的字段。這是在的Java Beans specification第8.3段規定:

如果我們發現一個匹配對get<PropertyName>set<PropertyName>方法是採取和返還相同種類,然後我們把這些方法是定義其名稱會讀寫屬性是<propertyName>

所以,當你有一個包含Long getRPersonId()setRPersonId(Long)類的自省,屬性可以從中提取。財產的名稱通常是從第一個字母的低位開始,並保持其餘的不變。但是,這並不總是如此,確切的規則在第8.8段:

因此,當我們從現有的Java名稱中間提取屬性或事件的名稱,我們通常轉換的第一個字符爲小寫。但是,爲了支持所有大寫名稱的偶爾使用,我們檢查名稱的前兩個字符是否都是大寫字母,如果是這樣,請保持獨立。因此,例如:

  • FooBah成爲fooBah
  • Z成爲z
  • URL成爲URL

我們提供了一個方法Introspector.decapitalize,將實現該轉換規則。

在上面的示例中,getter和setter會提供字符串RPersonId以變成屬性名稱。由於第一個兩個字符是大寫字母,所以第一個字符不會是小寫字母。因此,將導出的屬性名稱爲RPersonId,這解釋了您的輸出。

您也可以調用方法decapitalize,看看哪些屬性名稱會從一對的getter/setter的定位:

System.out.println(Introspector.decapitalize("RPersonId"));  // prints RPersonId 
System.out.println(Introspector.decapitalize("PersonAddress")); // prints personAddress 
相關問題