2011-08-24 16 views
8

Nel libro "Pensare in Java" c'è un esempio di come ottenere informazioni per un bean tramite Reflection/Introspection.Come può il tipo di una proprietà bean essere nullo?

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

In linea 4 di tale campione sopra v'è un controllo se il PropertyType è nullo. Quando e in quali circostanze ciò accade? Puoi fare un esempio?

risposta

2

Il Javadoc per il metodo degli stati di classe PropertyDescriptorgetPropertyType:

Il risultato può essere "nullo" se questa è una proprietà indicizzata che non si supporto accesso non indicizzato.

Le proprietà indicizzate sono quelle che sono supportate da una matrice di valori. Oltre ai metodi di accesso standard JavaBean, le proprietà indicizzate possono anche avere metodi per ottenere/impostare singoli elementi nella matrice, specificando un indice. Il JavaBean, può quindi, hanno i getter indicizzati e setter:

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

oltre il getter standard setter per l'accesso non indicizzato:

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

Andando dalla descrizione Javadoc, se si omette il Accessors non indicizzati, è possibile ottenere un valore restituito di null per il tipo di proprietà del descrittore di proprietà.

Quindi, se si dispone di un JavaBean delle seguenti varietà, si potrebbe ottenere un valore di ritorno nullo:

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, mentre che è possibile implementare le funzioni di accesso proprietà indicizzati da sola, non è consigliabile fare pertanto, poiché gli accessori standard vengono utilizzati per leggere e scrivere valori, se si utilizzano i metodi getReadMethod e getWriteMethod di PropertyDescriptor.

3

Dal JavaDoc:

restituisce null se il tipo è una proprietà indicizzata che non supporta accesso non indicizzato.

Quindi credo che se il tipo di proprietà è una proprietà indicizzata (come un array) restituirà null.

2

Questo restituisce null quando si ha un metodo come int getValue(int index).

Il codice seguente stampa

double is null 
ints class [I 

La classe:

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