java - tipos - ¿Cómo determinar la clase de un objeto?
tipos de herencia en java (7)
Si la clase B
y la clase C
extienden la clase A
y yo tenemos un objeto de tipo B
o C
, ¿cómo puedo determinar de qué tipo es una instancia?
Cualquier uso de cualquiera de los métodos sugeridos se considera un olor de código que se basa en un mal diseño de OO.
Si su diseño es bueno, no debería tener que usar getClass()
o instanceof
.
Cualquiera de los métodos sugeridos funcionará, pero es algo que debe tenerse en cuenta, en cuanto al diseño.
Podemos usar la reflexión en este caso.
objectName.getClass().getName();
Ejemplo:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
En este caso, obtendrá el nombre de la clase que pase el objeto a la variable de referencia de interfaz HttpServletRequest
.
Puedes usar:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass'' Class object
HTH. Pero creo que la mayoría de las veces no es una buena práctica usar eso para controlar el flujo o algo similar ...
Se presentaron varias respuestas correctas, pero todavía hay más métodos: Class.isAssignableFrom()
y simplemente intentar lanzar el objeto (lo que podría ClassCastException
una ClassCastException
).
Posibles maneras resumidas
Resumamos las posibles formas de probar si un objeto obj
es una instancia de tipo C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
Diferencias en el manejo null
Sin embargo, hay una diferencia en el manejo de null
:
- En los primeros 2 métodos, las expresiones evalúan a
false
siobj
esnull
(null
no es una instancia de nada). - El tercer método arrojaría una
NullPointerException
obviamente. - Los métodos 4º y 5º, por el contrario, aceptan
null
porquenull
se puede convertir en cualquier tipo.
Para recordar:
null
no es una instancia de ningún tipo, pero se puede convertir a cualquier tipo.
Notas
-
Class.getName()
no debe usarse para realizar una prueba "is-instance-of" si el objeto no es del tipoC
sino de una subclase, puede tener un nombre y un paquete completamente diferentes (por lo tanto, los nombres de las clases obviamente no coincide) pero sigue siendo de tipoC
- Por el mismo motivo de herencia,
Class.isAssignableFrom()
no es simétrico :
obj.getClass().isAssignableFrom(C.class)
devolveríafalse
si el tipo deobj
es una subclase deC
También hay un método .isInstance
en la Class
" Class
". si obtiene la clase de un objeto a través de myBanana.getClass()
, puede ver si su objeto myApple
es una instancia de la misma clase que myBanana
través de
myBanana.getClass().isInstance(myApple)
Utilice Object.getClass() . Devuelve el tipo de tiempo de ejecución del objeto.
if (obj instanceof C) {
//your code
}