der*_*oni 8 java reflection javabeans
在"Thinking in Java"一书中,有一个如何通过Reflection/Introspection获取bean信息的例子.
BeanInfo bi = Introspector.getBeanInfo(Car.class, Object.class);
for (PropertyDescriptor d: bi.getPropertyDescriptors()) {
Class<?> p = d.getPropertyType();
if (p == null) continue;
[...]
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例的第4行中,检查PropertyType是否为null.何时以及在何种情况下会发生这种情况?你能给我举个例子吗?
getPropertyType该类方法的 JavadocPropertyDescriptor指出:
如果这是不支持非索引访问的索引属性,结果可能为“null”。
索引属性是由值数组支持的属性。除了标准 JavaBean 访问器方法之外,索引属性还可能具有通过指定索引来获取/设置数组中的各个元素的方法。因此,JavaBean 可能具有索引的 getter 和 setter:
public PropertyElement getPropertyName(int index)
public void setPropertyName(int index, PropertyElement element)
Run Code Online (Sandbox Code Playgroud)
另外还有用于非索引访问的标准 getter 和 setter:
public PropertyElement[] getPropertyName()
public void setPropertyName(PropertyElement element[])
Run Code Online (Sandbox Code Playgroud)
根据Javadoc描述,如果省略非索引访问器,则可以获得null属性描述符的属性类型的返回值。
因此,如果您有以下类型的 JavaBean,您可能会得到 null 返回值:
class ExampleBean
{
ExampleBean()
{
this.elements = new String[10];
}
private String[] elements;
// standard getters and setters for non-indexed access. Comment the lines in the double curly brackets, to have getPropertyType return null.
// {{
public String[] getElements()
{
return elements;
}
public void setElements(String[] elements)
{
this.elements = elements;
}
// }}
// indexed getters and setters
public String getElements(int index) {
return this.elements[index];
}
public void setElements(int index, String[] elements)
{
this.elements[index] = elements;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,虽然您可以单独实现索引属性访问器,但不建议这样做,因为如果您getReadMethod碰巧getWriteMethod使用PropertyDescriptor.