2011-12-07 11 views
18

Ho un metodo di utilità che passa attraverso varie classi e recupera in modo ricorsivo i campi. Voglio controllare se quel campo è una collezione. Ecco alcuni esempi di codice:Java: Come verificare se un campo è di tipo java.util.Collection

void myMethod(Class<?> classToCheck) 

Field[] fields = classToCheck.getDeclaredFields(); 

for(Field field:fields) 
{ 
    // check if field if a Collection<?> 

} 

Grazie in anticipo per l'aiuto.

+1

Vuoi verificare se il tipo dichiarato del campo è un'implementazione di raccolta, o se l'oggetto reale a cui si riferisce il campo in un dato oggetto implementa la Collezione? I due risultati differirebbero se a) il campo fosse dichiarato come oggetto, ma a esso fosse assegnato un oggetto che implementava la raccolta, oppure b) il campo fosse dichiarato come raccolta (o discendente) ma era nullo. – DJClayworth

+0

possibile duplicato di [Come scoprire se un campo è l'istanza di un tipo tramite riflessione?] (Http://stackoverflow.com/questions/2262322/howto-find-out-if-a-field-is-instanceof-a- type-via-reflection) –

risposta

57
if (Collection.class.isAssignableFrom(field.getType())) { 

} 
+1

@DJClayworth no, restituisce' Classe '. Controlla la javadoc – Bozho

+0

@DJClayworth, [la documentazione che ti dimostra che è sbagliato è piuttosto facile da google] (http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#getType()). –

+2

@ user979467 L'ho appena testato, funziona. Forse stai facendo qualcos'altro di sbagliato? –

1

Utilizzando il getType() metodo

Field field = ...; 
if (Collection.class.isAssignableFrom(field.getType())){ 
    //do something with your collection 
} 
+2

no, non è così. Questo otterrà la classe che possiede il campo, piuttosto che il tipo di campo – Bozho

+0

Infatti. Ho appena notato il mio errore leggendo effettivamente la javadoc. Finora ho fatto affidamento sulla mia memoria. Corretto la mia risposta – Robin

7

Si dovrebbe usare Class.isAssignableFrom:

if (Collection.class.isAssignableFrom(field.getType()) 
    ... 
+0

isAssignableFrom accetta una classe, dove getType() restituisce un Type – DJClayworth

+3

no, restituisce un 'Class' – Bozho

0
for(Field field:fields) { // check if field if a Collection 
    Object myInstance = field.get(classInstance); 
    // where classInstance is the instance in which the fields is stored 
    if(myInstance instanceof Collection) { 
     //Do your thing 
    } 
} 

Questa verifica se l'oggetto reale a cui si riferisce il campo 'campo' (della oggetto classInstance) implementa Collection. Se vuoi verificare se il tipo dichiarato di Field implements Collection sarà diverso.

+1

e cosa succede se è "null"? – Bozho

+0

Quindi non è un'istanza di raccolta. instanceof gestisce correttamente questo caso, credo. – DJClayworth

+0

Nuove modifiche chiariscono che questa non era la domanda che l'OP chiedeva, ma lascerò questo qui come riferimento. – DJClayworth

0

È possibile utilizzare getType() nel seguente modo:

if (field.getType().equals(Collection.class) { 
    // Do something 
} 

questo funziona solo se il campo è dichiarato come Collection. Non funzionerà se il campo è un sottotipo di Raccolta, ad esempio List o Vector.

0

// Questo eseguire se

List<String> cashType = split(" ,AlL "); 
if(cashType instanceof Collection){ 
    System.out.println("cashType instanceof Collection"); 
}else{ 
    System.out.println("cashType is not instanceof Collection"); 
} 

// Esegue il resto

List<String> cashType = split(" ,AlL "); 
if(cashType instanceof Hashtable){ 
    System.out.println("cashType instanceof Collection"); 
}else{ 
    System.out.println("cashType is not instanceof Collection"); 
} 
Problemi correlati