为什么PropertyDescriptor返回一个以大写字母作为第一个字符的属性名称?

时间:2016-11-26 19:42:26

标签: java javabeans

我通过

获取有关课程的信息
Introspector.getBeanInfo(this.getClass()).getPropertyDescriptors()

然后通过调用propery[i].getName()获取该属性的名称。

如果房产没有单字母部分,一切都很好。例如,如果某个属性的名称为personAddress(同时其getter / setter - > getPersonAddress()setPersonAddress(String personAddress)),则表示正常,getName()返回{ {1}}。

但是,如果该媒体资源的名称为personAddressrPersonIdgetRPersonId()),则setRPersonId(Long rPersonId)会返回" RPersonId",即首字母已被大写!为什么呢?

根据这个:https://docs.oracle.com/javase/7/docs/api/java/beans/FeatureDescriptor.html

  

getName() - >获取此功能的编程名称。

那么,为什么它会以某种方式返回与其getter或者setter的名称相关的名称而不是该属性的真实姓名?

2 个答案:

答案 0 :(得分:2)

这实际上是记录在案的行为。

首先,通过发现他们的getter和setter完全定位属性名称,而不是通过查看类的字段。这在Java Beans specification

的第8.3段中有详细说明
  

如果我们发现一对匹配的get<PropertyName>set<PropertyName>方法采用并返回相同的类型,那么我们将这些方法视为定义一个读写属性,其名称将为{{1} }。

因此,当您对包含<propertyName>Long getRPersonId()的类进行内省时,可以从中提取属性。该属性的名称通常遵循第一个字母的下限,并保持其余部分不变。但情况并非总是如此,具体规则见第8.8段:

  

因此,当我们从现有Java名称的中间提取属性或事件名称时,我们通常会将第一个字符转换为小写。但是,为了支持偶尔使用所有大写字母,我们检查名称的前两个字符是否都是大写,如果是,请不要管它。例如:

     
      
  • setRPersonId(Long)变为FooBah
  •   
  • fooBah变为Z
  •   
  • z变为URL
  •   
     

我们提供了一个实现此转换规则的方法URL

在上面的示例中,getter和setter将提供String Introspector.decapitalize以转换为属性名称。由于第一个两个字符是大写的,因此第一个字符不会是低位字符。因此,将派生的属性名称为RPersonId,这将解释您的输出。

你也可以调用方法decapitalize来查看一对getter / setter中的属性名称:

RPersonId

答案 1 :(得分: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界面,他们不会给你这个。