¿Cómo determinar la clase de un objeto?

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?

 if (obj instanceof C) { //your code } 

Use Object.getClass () . Devuelve el tipo de tiempo de ejecución del objeto.

Se presentaron varias respuestas correctas, pero todavía hay más métodos: Class.isAssignableFrom() y simplemente intentar lanzar el objeto (que podría arrojar una ClassCastException ).

Posibles formas resumidas

Resumiremos las formas posibles 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 null :

  • En los primeros 2 métodos, las expresiones evalúan como false si obj es null ( null no es instancia de nada).
  • El tercer método arrojaría una NullPointerException obviamente.
  • ¡Los métodos 4to y 5to por el contrario aceptan null porque null se puede convertir a 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” porque si el objeto no es de tipo C sino una subclase de él, puede tener un nombre y un paquete completamente diferentes (por lo tanto, los nombres de clase obviamente no coincide) pero todavía es de tipo C
  • Por la misma razón de herencia Class.isAssignableFrom() no es simétrica :
    obj.getClass().isAssignableFrom(C.class) devolvería false si el tipo de obj es una subclase de C

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 …

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 encontrar la necesidad de usar getClass() o instanceof .

Cualquiera de los métodos sugeridos servirá, pero solo 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 cuyo objeto pase a la variable de referencia de la interfaz HttpServletRequest .

También hay un método .isInstance en la ClassClass “. si obtienes la clase de un objeto a través de myBanana.getClass() puedes ver si tu objeto myApple es una instancia de la misma clase que myBanana vía

 myBanana.getClass().isInstance(myApple)