我不熟悉java bean框架,在下面的场景中,我得到了方法getFooWithX的IndexedPropertyDescriptor,有人可以解释一下原因吗?
public class IntrospectorTest {
public static void main(String[] args) throws IntrospectionException {
BeanInfo info = Introspector.getBeanInfo(SubClass.class);
PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
for (int i = 0; i < descriptors.length; i++) {
System.out.println(descriptors[i].getClass().getName() + ":" + descriptors[i].getName());
}
}
}
abstract class BaseClass {
public abstract Object getFoo();
}
abstract class SubClass extends BaseClass {
public Object getFooWithX(int x) {
return null;
}
}
,结果将是:
java.beans.PropertyDescriptor:class
java.beans.PropertyDescriptor:foo
java.beans.IndexedPropertyDescriptor:fooWithX
为什么?
答案 0 :(得分:1)
如果一个方法名为getX而没有参数,则它被认为是非索引属性X的getter。如果一个方法名为getX,带有一个int参数,则它被视为索引的getter property X.这就是你返回IndexedPropertyDescriptor的原因。
索引属性是一个属性,它是一个数组,由整数索引。例如,如果用户可以拥有多个昵称,并且public String getNickNames(int n)
返回其* n *昵称,则“nickNames”是一个索引属性。还应该有一个public String[] getNickNames()
一次返回所有昵称,但即使没有这样的方法,Introspector仍会识别索引属性。
这是否合适取决于语义上“getFooWithX”的含义。如果“fooWithX”意味着是一个数组,并且参数是用于选择元素的索引,那么这在语义上是有意义的。如果参数不是数组的索引,那么建议将方法重命名为不以“get”开头(如果可能的话)。