2010-02-14 17 views
39

Voglio scoprire tramite riflessione se un campo è un'istanza di qualche tipo T.Come scoprire se un campo è un'istanza di un tipo tramite riflessione?

Diciamo che ho un oggetto o. Ora voglio sapere se ha campi che sono istanze di T. Posso ottenere tutti i campi con:

o.getClass().getFields(); 

posso ottenere il tipo di campo con:

field.getType(); 

Ma ora voglio sapere se questo tipo o qualsiasi supertipo uguale T. Devo chiamare il getSuperclass() in modo ricorsivo per essere sicuro di controllare tutti i supertipi?

risposta

38

Il piuttosto calligrafico Class.isAssignableFrom è quello che stai cercando. Io di solito finiscono dover leggere il javadoc per assicurarsi che ho capito il modo giusto intorno:

determina se la classe o interfaccia rappresentata dall'oggetto classe è sia la stessa, o è una superclasse o superinterfaccia di, la classe o l'interfaccia rappresentata dal parametro di classe specificato. Restituisce vero se così; altrimenti restituisce false. Se questo oggetto di classe rappresenta un tipo primitivo , questo metodo restituisce true se il parametro di classe specificato è esattamente questo oggetto di classe; altrimenti restituisce falso.

In particolare, questo metodo verifica se il tipo rappresentato dal parametro classe specificata può essere convertita nel tipo rappresentato da questo oggetto Class via una conversione identità o tramite un conversione riferimento ampliamento.

Ad esempio:

public class X { 

    public int i; 

    public static void main(String[] args) throws Exception { 
     Class<?> myType = Integer.TYPE; 
     Object o = new X(); 

     for (Field field : o.getClass().getFields()) { 
     if (field.getType().isAssignableFrom(myType)) { 
      System.out.println("Field " + field + " is assignable from type " + o.getClass()); 
     } 
     } 
    } 
} 
12

Se si desidera confrontare il tipo di campo di una classe personalizzata si dovrebbe provare questo, uso .class perché solo tipi primitivi ha .type.

if(field.getType().isAssignableFrom(**YOURCLASS.class**)){}

Problemi correlati