已经有自动生成的类,它们与声明其字段名称无关。尝试使用org.apache.commons.beanutils.PropertyUtils.getNestedProperty(Object bean, String name)
获取类的对象类型字段时,遇到错误:
java.lang.NoSuchMethodException:类上的未知属性'lSASPro' 'xyz'
有问题的字段名称类似于lSASPro
或类似的名称,它们以一个小写字母和一个大写字母顺序开头。 (lSASPro
在PropertyDescriptor步骤中将变成LSASPro
,因此以下代码中的getPropertyDescriptor()
返回null
// The file: org.apache.commons.beanutils.PropertyUtilsBean.java
// Retrieve the property getter method for the specified property
final PropertyDescriptor descriptor =
getPropertyDescriptor(bean, name);
if (descriptor == null) {
throw new NoSuchMethodException("Unknown property '" +
name + "' on class '" + bean.getClass() + "'" );
}
这是由于在Java Beans
中声明了 PropertyDescriptor 的行为,该行为获得具有以下规范(source)的字段名称:
因此,当我们从现有Java名称的中间提取属性或事件名称时,通常会将第一个字符转换为小写。但是,为了支持偶尔使用所有大写的名称,我们检查名称的前两个字符是否均为大写,是否保留为大写。例如:
FooBah
成为fooBah
Z
成为z
URL
成为URL
我们提供了Introspector.decapitalize方法,该方法实现了此转换规则。
应该将什么传递给PropertyUtils.getNestedProperty()
作为第二个参数,以使其处理像lSASPro
这样的字段名称?
Here使用类似"ClassName.lSASPro"
的名称作为第二个参数(字段名称),但这不适用于具有此类名称的第一级字段(即,它将无效)对于lSASPro
类中的Test
字段,像这样:PropertyUtils.getNestedProperty(Test, lSASPro)
,因为我们不能通过"Test.lSASPro"
作为第二个参数,否则会抱怨Unknown property
Test。 lSASPro on class 'Test'
)