2011-12-07 12 views
18

Tengo un método de utilidad que atraviesa varias clases y recupera recursivamente los campos. Quiero comprobar si ese campo es una Colección. Aquí hay un código de ejemplo:Java: cómo comprobar si un campo es del tipo java.util.Collection

void myMethod(Class<?> classToCheck) 

Field[] fields = classToCheck.getDeclaredFields(); 

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

} 

Gracias de antemano por la ayuda.

+1

¿Quieres probar si el tipo declarado del campo es una implementación de colección, o si el objeto real al que se refiere el campo en cualquier objeto implementado Colección? Los dos resultados diferirían si a) el Campo se declarase como Objeto, pero se le asignó un objeto que implementa la Colección, o b) el Campo se declaró como Colección (o un descendiente) pero fue nulo. – DJClayworth

+0

posible duplicado de [¿Cómo averiguar si un campo es instancia de un tipo a través de la reflexión?] (Http://stackoverflow.com/questions/2262322/howto-find-out-if-a-field-is-instanceof-a- type-via-reflection) –

Respuesta

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

} 
+1

@DJClayworth no, devuelve' Clase '. Compruebe el javadoc – Bozho

+0

@DJClayworth, [la documentación que demuestra que está equivocado es bastante fácil de google] (http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#getType()). –

+2

@ user979467 Acabo de probarlo, funciona. Tal vez estás haciendo algo más mal? –

1

Utilizando el getType() método

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

no, eso no es todo. Esto obtendrá la clase que posee el campo, en lugar del tipo de campo – Bozho

+0

De hecho. Me di cuenta de mi error al leer el javadoc. Hasta ahora confiando en mi memoria. Corregí mi respuesta – Robin

7

Debe utilizar Class.isAssignableFrom:

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

isAssignableFrom toma una clase, donde getType() devuelve un tipo – DJClayworth

+3

no, devuelve una 'Clase' – 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 
    } 
} 

Esto comprueba si el objeto real contemplado por el 'campo' del campo (de la object classInstance) implementa Collection. Si desea probar si el tipo declarado de Campo implementa la Colección, entonces será diferente.

+1

y ¿qué pasa si es 'nulo'? – Bozho

+0

Entonces no es una instancia de Colección. instanceof maneja este caso correctamente, creo. – DJClayworth

+0

Las nuevas ediciones dejan en claro que esta no era la pregunta que estaba haciendo el OP, pero lo dejaré aquí como referencia. – DJClayworth

0

Puede utilizar getType() de la siguiente manera:

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

esto sólo funcionará si el campo está declarada como una Collection. No funcionará si el campo es un subtipo de Colección, como List o Vector.

0

// Esto se ejecuta si

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

// Esto ejecuta otra cosa

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