Question Comment déterminer la classe d'un objet?


Si classe B et classe C étendre la classe A et j'ai un objet de type B ou C, comment puis-je déterminer de quel type il s'agit d'une instance?


428
2018-02-12 15:18


origine


Réponses:


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

699
2018-02-12 15:21



Utilisation Object.getClass (). Il renvoie le type d'exécution de l'objet.


291
2018-02-12 15:20



Plusieurs bonnes réponses ont été présentées, mais il existe encore d'autres méthodes: Class.isAssignableFrom() et tentant simplement de lancer l'objet (qui pourrait jeter un ClassCastException).

Moyens possibles résumés

Résumons les moyens possibles de tester si un objet obj est une instance de type 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) {
}

Différences dans null manipulation

Il y a une différence dans null manipulation cependant:

  • Dans les deux premières méthodes, les expressions évaluent false si obj est null (null n'est rien d'instance).
  • La 3ème méthode lancerait un NullPointerException évidemment.
  • Les 4ème et 5ème méthodes au contraire acceptent null car null peut être lancé à n'importe quel type!

Se souvenir: null  n'est pas une instance de tout type mais il peut être cast à tout type.

Remarques

  • Class.getName() ne devrait pas être utilisé pour effectuer un "est-instance-de" essai parce que l'objet n'est pas de type C mais une sous-classe de celui-ci, il peut avoir un nom et un package complètement différents (donc les noms de classes ne correspondent évidemment pas) mais il est toujours de type C.
  • Pour la même raison d'héritage Class.isAssignableFrom() n'est pas symétrique:
    obj.getClass().isAssignableFrom(C.class) retournerais false si le type de obj est une sous-classe de C.

137
2017-08-21 12:53



Vous pouvez utiliser:

Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object

HTH. Mais je pense que la plupart du temps ce n'est pas une bonne pratique d'utiliser ça pour contrôler le flux ou quelque chose de similaire ...


30
2018-02-12 15:22



Toute utilisation de l'une des méthodes suggérées est considérée comme une odeur de code qui est basée sur un mauvais design OO.

Si votre design est bon, vous ne devriez pas avoir besoin d'utiliser getClass() ou instanceof.

N'importe laquelle des méthodes suggérées fera l'affaire, mais gardez à l'esprit que vous devez en tenir compte.


25
2018-02-12 15:25



Nous pouvons utiliser la réflexion dans ce cas

objectName.getClass().getName();

Exemple:-

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getClass().getName();
}

Dans ce cas, vous obtiendrez le nom de la classe à laquelle l'objet passera HttpServletRequest variable de référence d'interface.


14
2018-05-13 09:58



Il y a aussi un .isInstance méthode sur le "Class"class., si vous obtenez la classe d'un objet via myBanana.getClass() vous pouvez voir si votre objet myApple est une instance de la même classe que myBanana via

myBanana.getClass().isInstance(myApple)

13
2018-02-12 16:04