- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在通过
获取有关类(class)的信息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()
-> Gets the programmatic name of this feature.
那么为什么它会返回一个与其 getter 或 setter 名称相关的名称,而不是属性的真实名称?
最佳答案
这实际上是记录在案的行为。
首先,属性名称完全是通过发现它们的 getter 和 setter 来定位的,而不是通过查看类的字段来定位的。这在 Java Beans specification 的第 8.3 段中指定。 :
If we discover a matching pair of
get<PropertyName>
andset<PropertyName>
methods that take and return the same type, then we regard these methods as defining a read-write property whose name will be<propertyName>
.
因此,当您对包含 Long getRPersonId()
的类进行自省(introspection)时和 setRPersonId(Long)
,可以从中提取属性。属性的名称一般遵循小写第一个字母,其余保持不变。但情况并非总是如此,确切的规则在第 8.8 段中:
Thus when we extract a property or event name from the middle of an existing Java name, we normally convert the first character to lower case. However to support the occasional use of all upper-case names, we check if the first two characters of the name are both upper case and if so leave it alone. So for example:
FooBah
becomesfooBah
Z
becomesz
URL
becomesURL
We provide a method
Introspector.decapitalize
which implements this conversion rule.
在上面的示例中,getter 和 setter 将提供字符串 RPersonId
变成属性名称。因为前两个字符是大写的,所以第一个字符不会是小写的。因此,将派生的属性名称是 RPersonId
,这解释了您的输出。
你也可以调用方法 decapitalize
从一对 getter/setter 中查看哪个属性名称:
System.out.println(Introspector.decapitalize("RPersonId")); // prints RPersonId
System.out.println(Introspector.decapitalize("PersonAddress")); // prints personAddress
关于java - 为什么 PropertyDescriptor 会返回一个以大写字母作为第一个字符的属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40822397/
我们正在使用 DynamicObject 创建动态属性,但随后我们想使用 PropertyGrid 来显示和编辑这些属性。 首先,我找到了this文章和这个one .我尝试使用第二篇文章的代码,但以更
我有一个数组字段的 PropertyDescriptor,如下所示。 Foo[] fooArray; 如何获取 Foo 的 PropertyDescriptor,以便能够获取该类的 getter 和
我有一组自定义 PropertyDescriptor,我也想添加类别,以便它们以更有条理的方式显示在 PropertyGrid 中。我希望每种类型的 PropertyDescriptor 都属于特定的
如何获取当前属性的 PropertyDescriptor?例如: [MyAttribute("SomeText")] public string MyProperty { get{....}
我正在通过实现 ICustomTypeDescriptor 自定义对象类型在 PropertyGrid 中的显示方式。我允许用户创建他们自己的自定义属性,这些属性存储在单个键和值字典中。我能够为这些值
.NET 上的 PropertyType 和 ComponentType 有什么区别 PropertyDescriptor ? 文档并没有真正解释 PropertyType When overridd
我有一个简单的 Windows 窗体应用程序,它使用 DataGridView绑定(bind)到 BindingList<>我的自定义对象 (MCO)。 我还实现了一个自定义 TypeDescript
如果我有: class A { public virtual string Owner { get; set; } } class B : A { public override st
我对这个方法的细节很感兴趣。如何以及通过什么来跟踪属性(property)的值(value)变化? 最佳答案 Andrew Smith 有一个 cool blog post关于它,我认为它会对您有所帮
我是 WPF 的新手,我正在尝试自定义一些数据网格以以可读的方式显示数据。我看过this article ,我想知道 - 最后将 PropertyDescriptor 属性转换为两个类,使用 as 关
是否有用于为属性设置默认 PropertyDescriptor 的属性?我只想给属性添加一个属性并指定 PropertyDescriptor。然后将创建 PropertyDescriptor 的实例。
我正在尝试在 WCF 服务中进行一些验证,为此我正在使用 WCFDataAnnotations我通过 this post 找到的 问题是它不能递归验证,所以对于嵌套对象它不起作用。这么说吧 [Data
我正在通过 获取有关类(class)的信息 Introspector.getBeanInfo(this.getClass()).getPropertyDescriptors() 然后通过调用 prop
我正在尝试检查一个属性是否应用了 DataMemberAttribute(使用 TypeDescriptor) 这是我现在拥有的: PropertyDescriptor targetProp = ta
我一直在努力让自定义 PropertyDescriptors 以我想要的方式使用 PropertyGrid。 前提: 我有一个名为“Animal”的类,其中包含属性 Age , Type , Loca
使用为 IsReadOnly() 方法返回值的 PropertyDescriptor 和与 ReadOnlyAttribute 关联的有什么区别>? 最佳答案 主要区别在于,如果您提供自己的 Prop
PropertyDescriptor是自定义属性描述符可以从中继承的抽象类。该类有一个 IsBrowsable 属性,根据 MSDN: Gets a value indicating whether
我有一些代码可以枚举一个对象并根据它的 ValidationAttribute 记录它的任何错误。 当它找到它们时,我希望创建一个名为 RuleViolations 的自定义类的集合。 RuleVio
我正在实现自定义 ModelBinder,我试图用 PropertyDescriptor.SetValue 设置一个属性我不明白为什么它不起作用。 对于某些复杂属性,未设置值但不会引发异常。该属性仍然
各位 SO 成员大家好! 我正在为 Eclipse RCP 应用程序编写一个插件,当我从 TreeViewer 选择一行时,它的属性会出现在属性 View 中。 最初我在寻找一种可以将某些属性设置为只
我是一名优秀的程序员,十分优秀!