我通过
获取有关课程的信息Introspector.getBeanInfo(this.getClass()).getPropertyDescriptors()
然后通过调用propery[i].getName()
获取该属性的名称。
如果房产没有单字母部分,一切都很好。例如,如果某个属性的名称为personAddress
(同时其getter / setter - > getPersonAddress()
,setPersonAddress(String personAddress)
),则表示正常,getName()
返回{ {1}}。
但是,如果该媒体资源的名称为personAddress
(rPersonId
,getRPersonId()
),则setRPersonId(Long rPersonId)
会返回" RPersonId",即首字母已被大写!为什么呢?
根据这个:https://docs.oracle.com/javase/7/docs/api/java/beans/FeatureDescriptor.html:
getName()
- >获取此功能的编程名称。
那么,为什么它会以某种方式返回与其getter或者setter的名称相关的名称而不是该属性的真实姓名?
答案 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界面,他们不会给你这个。