2016-11-26 234 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 
相关问题