2011-08-24 7 views
8

En el libro "Thinking in Java" hay un ejemplo de cómo obtener información para un bean a través de Reflection/Introspection.¿Cómo puede ser nulo el tipo de propiedad de un frijol?

BeanInfo bi = Introspector.getBeanInfo(Car.class, Object.class); 
for (PropertyDescriptor d: bi.getPropertyDescriptors()) { 
    Class<?> p = d.getPropertyType(); 
    if (p == null) continue; 
    [...] 
} 

En la línea 4 de la muestra anterior hay una marca de verificación si el Tipo de propiedad es nulo. ¿Cuándo y en qué circunstancias sucede eso? ¿Puede dar un ejemplo?

Respuesta

2

El Javadoc para el método de los estados de clase PropertyDescriptorgetPropertyType:

El resultado puede ser "nulo" si se trata de una propiedad indizada que no soporte de acceso no indexada.

Las propiedades indexadas son aquellas respaldadas por una matriz de valores. Además de los métodos de acceso JavaBean estándar, las propiedades indexadas también pueden tener métodos para obtener/establecer elementos individuales en la matriz, especificando un índice. El JavaBean, pueden, por tanto, tienen los captadores indexados y definidores:

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

además del captador estándar y setter para el acceso no indexada:

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

A juzgar por la descripción de Javadoc, si se omite el Los descriptores de acceso no indexados pueden obtener un valor de retorno de null para el tipo de propiedad del descriptor de propiedad.

Por lo tanto, si usted tiene un JavaBean de la siguiente variedad, se puede obtener un valor de retorno nulo:

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

} 

Nota, mientras que se puede implementar los descriptores de acceso indexado solo, no se recomienda hacer Entonces, como los accesadores estándar se usan para leer y escribir valores, si usa los métodos getReadMethod y getWriteMethod del PropertyDescriptor.

3

Desde el JavaDoc:

devuelve NULL si el tipo es una propiedad indexada que no admite acceso no indexada.

Supongo que si el tipo de propiedad es una propiedad indexada (como una matriz) devolverá null.

2

Esto devuelve nulo cuando tiene un método como int getValue(int index).

Los siguientes código imprime

double is null 
ints class [I 

La clase:

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; 
    } 
} 
Cuestiones relacionadas