Как тип свойства bean может быть нулевым? - PullRequest
8 голосов
/ 24 августа 2011

В книге «Мышление на Java» есть пример того, как получить информацию для бина с помощью Reflection / Introspection.

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 ]

3 голосов
/ 24 августа 2011

Из JavaDoc :

Возвращает ноль, если тип является индексированным свойством, которое не поддерживает неиндексированный доступ.

Так что я думаю, что если тип свойства является индексированным свойством (например, массивом), он вернет null.

2 голосов
/ 24 августа 2011

Возвращает ноль, если у вас есть метод, такой как int getValue(int index).

Следующий код печатает

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;
  }
}
2 голосов
/ 24 августа 2011

Javadoc для метода getPropertyType класса PropertyDescriptor указывает:

Результат может быть "нулевым", если это индексированное свойство, которое неподдержка неиндексированного доступа.

Индексированные свойства - это те, которые поддерживаются массивом значений.В дополнение к стандартным методам доступа JavaBean индексированные свойства могут также иметь методы для получения / установки отдельных элементов в массиве путем указания индекса.Поэтому JavaBean может иметь индексированные геттеры и сеттеры:

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

в дополнение к стандартным геттерам и сеттерам для неиндексированного доступа:

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 и getWriteMethod методы PropertyDescriptor.

...