bean属性的类型如何为null?

时间:2011-08-24 06:35:01

标签: 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;
  [...]
}

在上面的示例的第4行中,检查PropertyType是否为null。何时以及在何种情况下会发生这种情况?你能举个例子吗?

3 个答案:

答案 0 :(得分:3)

来自JavaDoc

  

如果类型是不支持的索引属性,则返回null   非索引访问。

所以我猜如果属性类型是索引属性(如数组),它将返回null

答案 1 :(得分:2)

PropertyDescriptor类的getPropertyType方法的Javadoc声明:

  

如果这是一个没有的索引属性,结果可能是“null”   支持非索引访问。

索引属性是由值数组支持的属性。除了标准的JavaBean访问器方法之外,索引属性还可以具有通过指定索引来获取/设置数组中的各个元素的方法。因此,JavaBean可能具有索引的getter和setter:

public PropertyElement getPropertyName(int index)
public void setPropertyName(int index, PropertyElement element)

另外还有用于非索引访问的标准getter和setter:

public PropertyElement[] getPropertyName()
public void setPropertyName(PropertyElement element[])

通过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;
    }

}

注意,虽然您可以单独实现索引属性访问器,但不建议这样做,因为标准访问器用于读取和写入值,如果您碰巧使用getReadMethod和{{ 3}} PropertyDescriptor的方法。

答案 2 :(得分:2)

如果您使用int getValue(int index)等方法,则返回null。

以下代码打印

double is null
ints class [I

班级:

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class BeanInfos {

public static void main(String[] args) {

    try {
      BeanInfo bi = Introspector.getBeanInfo(ClassA.class, Object.class);
      for (PropertyDescriptor d : bi.getPropertyDescriptors()) {
        Class<?> p = d.getPropertyType();
        if (p == null)
          System.out.println(d.getName() + " is null" );
        else
          System.out.println(d.getName() + " " + p);
      }
    } catch (IntrospectionException e) {
      e.printStackTrace();
    }
  }

}

class ClassA {
  private int[] ints;
  private double[] doubles;

  public int[] getInts() {
    return ints;
  }

  public void setInts(int[] ints) {
    this.ints = ints;
  }

  public double getDouble(int idx) {
    return doubles[idx];
  }

  public void setDoubles(double val, int idx) {
    this.doubles[idx] = val;
  }
}