繁体   English   中英

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

[英]Why does PropertyDescriptor return a property name with uppercase as first character?

我正在获取有关课程的信息

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

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

如果房产没有单字母部分,一切都很好。 例如,如果属性具有名称personAddress (同时其getter / setter - > getPersonAddress()setPersonAddress(String personAddress) ),则可以, 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名称相关的名称而不是该属性的真实名称?

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

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

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

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

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

  • FooBah变成了fooBah
  • Z变为z
  • URL成为URL

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

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

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

System.out.println(Introspector.decapitalize("RPersonId"));     // prints RPersonId
System.out.println(Introspector.decapitalize("PersonAddress")); // prints personAddress

因为这是宗教的一部分。

做Java Bean的人觉得应该总是通过一对方法访问属性。 所以你没有得到数据成员的名字。 您将获得只能通过方法访问的属性。

这来自文档:

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接口,他们不会给你这个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM