2010-02-14 14 views
39

Quiero averiguar por reflexión si un campo es una instancia de algún tipo T.¿Cómo averiguar si un campo es instancia de un tipo mediante reflexión?

Digamos que tengo un objeto o. Ahora quiero saber si tiene algún campo que sea instancia de T. Puedo conseguir todos los campos con:

o.getClass().getFields(); 

puedo obtener el tipo del campo con:

field.getType(); 

Pero ahora quiero saber si este tipo o cualquier supertipo es igual T. ¿Debo llamar al getSuperclass() de forma recursiva para asegurarme de verificar todos los supertipos?

Respuesta

38

Lo que está buscando es la bien llamada Class.isAssignableFrom. Por lo general terminan tener que leer el javadoc para asegurarse de que lo reciba de la manera correcta:

Determina si la clase o interfaz representado por este objeto clase es ya sea el mismo que, o es una superclase o superinterfaz de la clase o interfaz representada por el parámetro de clase especificado. Devuelve verdadero si entonces; de lo contrario, devuelve falso. Si este objeto de clase representa un tipo primitivo , este método devuelve verdadero si el parámetro de clase especificado es exactamente este objeto de clase; de lo contrario, devuelve falso.

Específicamente, este método pone a prueba si el tipo representado por el parámetro clase especificada puede convierte en el tipo representado por este objeto clase a través de una conversión de identidad o por medio de una referencia conversión de ampliación.

Por ejemplo:

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

Si desea comparar el tipo de campo de una clase personalizada que debe tratar esto, .class uso debido a que sólo los tipos primitivos tiene .TYPE.

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

Cuestiones relacionadas