Estoy jugando con la API de reflexión de Java e intentando manejar algunos campos. Ahora estoy atascado con la identificación del tipo de mis campos. Las cuerdas son fáciles, solo hazlo myField.getType().equals(String.class)
. Lo mismo se aplica para otras clases no derivadas. Pero, ¿cómo verifico las clases derivadas? Por ejemplo, LinkedList
como subclase de List
. No puedo encontrar ninguno isSubclassOf(...)
o extends(...)
método. ¿Necesito caminar por todogetSuperClass()
y encontrar mi supeclase por mi cuenta?
java
class
reflection
craesh
fuente
fuente
LinkedList
No es una subclase deList
. Es una implementación deList
.Respuestas:
Quieres este método:
donde en general,
List
(arriba) se debe reemplazar consuperclass
y semyClass
debe reemplazar consubclass
Desde el JavaDoc :
Referencia:
Class.isAssignableFrom(Class)
Relacionado:
a) Compruebe si un objeto es una instancia de una clase o interfaz (incluidas las subclases) que conoce en tiempo de compilación:
Ejemplo:
b) Verifique si un Objeto es una instancia de una Clase o Interfaz (incluidas las subclases) que solo conoce en tiempo de ejecución:
Ejemplo:
fuente
SUPERCLASS.isAssignableFrom(SUBCLASS)
esto me confundió primero, aunque en realidad es obvio teniendo en cuenta el nombre.SUPERCLASS.isExtendedBy(SUBCLASS)
sería mucho más fácil de entenderisExtendedBy
es un mal nombre comoCLASS.isAssignableFrom(CLASS)
sería cierto (y, porCLASS.isExtendedBy(CLASS)
lo tanto , también). Esto no sería lo que esperaba.Otra opción es la instancia de:
fuente
Class.isInstance(object)
download.oracle.com/javase/6/docs/api/java/lang/…Field
. Pero solo quiero "mirar" a mi clase y sus campos, no quiero "probarlos".instanceof
también funciona para los padres (en este casoNumber
) en sí no solo para niñosinstanceof funciona en instancias, es decir, en objetos. A veces quieres trabajar directamente con las clases. En este caso, puede usar asSubClass método de la clase Class. Algunos ejemplos:
1)
esto pasará sin problemas porque JFrame es una subclase de Object. c contendrá un objeto de clase que representa la clase JFrame.
2)
esto lanzará una java.lang.ClassCastException porque JFrame NO es una subclase de JButton. c no se inicializará.
3)
esto pasará sin problemas porque JFrame implementa la interfaz java.io.Serializable. c contendrá un objeto de clase que representa la clase JFrame.
Por supuesto, deben incluirse las importaciones necesarias.
fuente
Esto funciona para mi:
fuente
Esta es una versión mejorada de la respuesta de @ schuttek. Se mejora porque devuelve correctamente falso para primitivas (por ejemplo, isSubclassOf (int.class, Object.class) => false) y también maneja correctamente las interfaces (por ejemplo, isSubclassOf (HashMap.class, Map.class) => true).
fuente
Un método recursivo para verificar si a
Class<?>
es una subclase de otraClass<?>
...Versión mejorada del @Al Kra 's respuesta :
fuente
//Herencia
//Métodos
// Prueba el código
//Resultado
fuente