为什么javabeans框架为NON索引方法创建IndexedPropertyDescriptor

时间:2012-08-31 03:36:08

标签: javabeans

我不熟悉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

为什么?

1 个答案:

答案 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”开头(如果可能的话)。