
[英]In JavaBean, does the file always recognize the first name of property as uppercase?
[英]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
。
但是如果属性名称为rPersonId
( getRPersonId()
, 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.