Estoy jugando con la API de reflexión de Java y tratando de manejar algunos campos. Ahora estoy atascado con la identificación del tipo de mis campos. Las cadenas son fáciles, solo haz myField.getType().equals(String.class)
. Lo mismo aplica para otras clases no derivadas. ¿Pero cómo verifico las clases derivadas? P.ej. LinkedList
como subclase de List
. No puedo encontrar ningún método isSubclassOf(...)
o extends(...)
. ¿Tengo que recorrer todos los getSuperClass()
y encontrar mi supeclass por mi cuenta?Comprueba si una clase es una subclase de otra clase en Java
Respuesta
desea que este método:
boolean isList = List.class.isAssignableFrom(myClass);
donde, en general, List
(arriba) debe sustituirse por superclass
y myClass
debe sustituirse por subclass
Desde el JavaDoc:
Determina si la clase o interfaz representada por este objeto
Class
es th th El mismo que, o es una superclase o superinterfaz de, la clase o interfaz representada por el parámetroClass
especificado. Devuelvetrue
si es así; de lo contrario, devuelvefalse
. Si este objetoClass
representa un tipo primitivo, este método devuelvetrue
si el parámetroClass
especificado es exactamente este objetoClass
; de lo contrario, devuelvefalse
.
Referencia:
relacionadas:
a) Comprobar si un objeto es una instancia de una clase o interfaz (incluyendo subclases) se conocen en tiempo de compilación:
boolean isInstance = someObject instanceof SomeTypeOrInterface;
Ejemplo:
assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>);
b) comprobar si un objeto es una instancia de una clase o interfaz (incluyendo las subclases) sólo se conoce en tiempo de ejecución:
Class<?> typeOrInterface = // acquire class somehow
boolean isInstance = typeOrInterface.isInstance(someObject);
Ejemplo:
public boolean checkForType(Object candidate, Class<?> type){
return type.isInstance(candidate);
}
Tenga en cuenta el esquema: 'SUPERCLASS.isAssignableFrom (SUBCLASS)' Esto me confundió primero, aunque en realidad es obvio teniendo en cuenta la nomenclatura. – codepleb
@TrudleR Estoy de acuerdo. Algo como 'SUPERCLASS.isExtendedBy (SUBCLASS)' sería mucho más fácil de entender –
@SeanPatrickFloyd en realidad 'isExtendedBy' es un nombre incorrecto ya que' CLASS.isAssignableFrom (CLASS) 'sería verdadero (y por lo tanto' CLASS.isExtendedBy (CLASS) ' también). Esto no sería lo que esperaba. – Qw3ry
Otra opción es instanceof:
Object o =...
if (o instanceof Number) {
double d = ((Number)o).doubleValue(); //this cast is safe
}
Buena llamada (+1). Y luego está la combinación de los dos mecanismos: 'Class.isInstance (object)' http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#isInstance%28java. lang.Object% 29 –
Esto implicaría que usted instancia ese 'Campo'. Pero solo quiero "mirar" mi clase y sus campos, no quiero "probarlos". – craesh
Veo este método mucho más limpio y claro que el modo "isAssignableFrom", en el caso de que necesite verificar el árbol de herencia de un objeto. – cbuchart
instanceof trabajos sobre los casos, es decir, en los objetos. A veces quieres trabajar directamente con las clases. En este caso, puede utilizar el método asSubClass de la clase Class. Algunos ejemplos:
1)
Class o=Object.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
este pasará a través sin problemas porque JFrame es subclase de Object. c contendrá un objeto Class que representa la clase JFrame.
2)
Class o=JButton.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
Se iniciará un java.lang.ClassCastException porque JFrame no es subclase de JButton. c no se inicializará.
3)
Class o=Serializable.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
este pasará a través sin problemas porque JFrame implementa la interfaz java.io.Serializable. c contendrá un objeto Class que representa la clase JFrame.
Por supuesto, se deben incluir las importaciones necesarias.
Esto funciona para mí:
protected boolean isTypeOf(String myClass, Class<?> superClass) {
boolean isSubclassOf = false;
try {
Class<?> clazz = Class.forName(myClass);
if (!clazz.equals(superClass)) {
clazz = clazz.getSuperclass();
isSubclassOf = isTypeOf(clazz.getName(), superClass);
} else {
isSubclassOf = true;
}
} catch(ClassNotFoundException e) {
/* Ignore */
}
return isSubclassOf;
}
Funciona bien, pero es posible que deba agregar una comprobación nula después de clazz = clazz.getSuperclass() en caso de que golpee java.lang.Object que no tenga una superclase. –
Un método recrursive para comprobar si un clazz es un "niño" de una superclase ...
Versión mejorada de la respuesta de @ To_Kra:
protected boolean isSubclassOf(Class<?> clazz, Class<?> superClass) {
if (superClass.equals(Object.class)) {
// Every class is an Object.
return true;
}
if (clazz.equals(superClass)) {
return true;
} else {
clazz = clazz.getSuperclass();
// every class is Object, but superClass is below Object
if (clazz.equals(Object.class)) {
// we've reached the top of the hierarchy, but superClass couldn't be found.
return false;
}
// try the next level up the hierarchy.
return isSubclassOf(clazz, superClass);
}
}
Esta es una versión mejorada de la respuesta de @ schuttek. Se ha mejorado porque devuelve correctamente false para las primitivas (por ejemplo, isSubclassOf (int.class, Object.class) => false) y también maneja correctamente las interfaces (por ejemplo, isSubclassOf (HashMap.class, Map.class) => true).
static public boolean isSubclassOf(final Class<?> clazz, final Class<?> possibleSuperClass)
{
if (clazz == null || possibleSuperClass == null)
{
return false;
}
else if (clazz.equals(possibleSuperClass))
{
return true;
}
else
{
final boolean isSubclass = isSubclassOf(clazz.getSuperclass(), possibleSuperClass);
if (!isSubclass && clazz.getInterfaces() != null)
{
for (final Class<?> inter : clazz.getInterfaces())
{
if (isSubclassOf(inter, possibleSuperClass))
{
return true;
}
}
}
return isSubclass;
}
}
- 1. AS3 - ¿Puedo saber si una clase implementa una interfaz (o es una subclase de otra clase)?
- 2. Prueba si una clase es una subclase de otra clase en lisp común
- 3. ¿Cómo determinar si una clase es una subclase de otra clase?
- 4. Comprueba si un objeto pertenece a una clase en Java
- 5. Cómo saber si una clase desciende de otra clase
- 6. No encontraste parámetro de tipo si es una clase interna de la subclase en Java
- 7. ¿Cómo comprobar si una subclase es una instancia de una clase en tiempo de ejecución?
- 8. ¿Cómo comprobar si una clase hereda otra clase sin instanciarla?
- 9. Comprueba si existe una clase de CSS sin jQuery
- 10. ¿Cómo probar si una clase Java se extiende a otra en el tiempo de ejecución?
- 11. C#: probar si una clase en una instancia de una súper clase en lugar de una subclase
- 12. ¿Cómo puedo determinar si una clase amplía otra clase en Java?
- 13. ¿Cómo saber si una clase de Java es abstracta?
- 14. ¿Puedo llamar a una función definida en una clase parcial de otra clase parcial? ¿Es posible?
- 15. Comprobación de si una clase es java.lang.Enum
- 16. ¿Copiar una clase a otra?
- 17. ¿Qué es una clase invariante en java?
- 18. ¿Cómo determinar programáticamente si la clase es una clase de caso o una clase simple?
- 19. ¿Puedo instanciar una clase de PHP dentro de otra clase?
- 20. ¿Cómo crear una clase, una subclase y propiedades en Lua?
- 21. Burlarse de una clase que hereda de otra clase
- 22. ¿Llamar a una clase CSS dentro de otra clase?
- 23. Pruebe si una clase es polimórfica
- 24. ¿Qué es una clase de controlador? (Java)
- 25. ¿Cómo obtener una instancia específica de clase de otra clase en Java?
- 26. Comprueba si una expresión regular cubre otra expresión regular
- 27. cómo usar la clase anidada en otra clase en java?
- 28. ¿Cómo sobrescribir/extender una clase interna desde una subclase?
- 29. Tener 2 variables con el mismo nombre en una clase que amplía otra clase en Java
- 30. Usando NSCoding en una subclase de clase personalizada
'LinkedList' no es una subclase de' List'. Es una * implementación * de 'List'. –
* Subtipo * podría ser un término mejor – jpaugh