Как тип свойства bean может быть null?
в книге "мышление на Java" есть пример того, как получить информацию для Бина через отражение/интроспекцию.
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 ответов
Javadoc для getPropertyType
метод PropertyDescriptor
класса гласит:
результат может быть "null", если это индексированное свойство, которое не поддержка неиндексированного доступа.
индексированные свойства-это те, которые поддерживаются массивом значений. В дополнение к стандартным методам доступа 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
.
С JavaDoc:
возвращает null, если тип является индексированным свойством, которое не поддерживает неиндексированный доступ.
поэтому я думаю, что если тип свойства является индексированным свойством (например, массивом), он вернет null
.
Это возвращает null, когда у вас есть метод, как 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;
}
}