我正在通过以下方式获取有关课程的信息
Introspector.getBeanInfo(this.getClass()).getPropertyDescriptors()
Run Code Online (Sandbox Code Playgroud)
然后通过调用获取属性的名称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>andset<PropertyName>方法接受并返回相同的类型,那么我们认为这些方法定义了一个读写属性,其名称将为<propertyName>。
因此,当您对包含Long getRPersonId()and的类进行内省时setRPersonId(Long),可以从中提取一个属性。属性的名称通常遵循小写第一个字母,其余保持不变。但情况并非总是如此,确切的规则在第 8.8 段:
因此,当我们从现有 Java 名称的中间提取属性或事件名称时,我们通常将第一个字符转换为小写。然而,为了支持偶尔使用所有大写的名字,我们检查名字的前两个字符是否都是大写的,如果是的话就不要管它。例如:
FooBah变成fooBahZ变成zURL变成URL我们提供了一种
Introspector.decapitalize实现此转换规则的方法。
在上面的示例中,getter 和 setter 将提供 StringRPersonId以转换为属性名称。由于前两个字符是大写的,所以第一个字符不会是小写的。因此,将派生的属性名称是RPersonId,这解释了您的输出。
您还可以调用该方法decapitalize以查看从一对 getter / setter 中将找到哪个属性名称:
System.out.println(Introspector.decapitalize("RPersonId")); // prints RPersonId
System.out.println(Introspector.decapitalize("PersonAddress")); // prints personAddress
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2372 次 |
| 最近记录: |