web-dev-qa-db-fra.com

Comment déterminer la classe d'un objet?

Si la classe Bet la classe Cétendent la classe Aet que j'ai un objet de type Bou Cname__, comment puis-je déterminer de quel type il s'agit d'une instance?

474
carrier
if (obj instanceof C) {
//your code
}
747
IAdapter

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

318
Bill the Lizard

Plusieurs bonnes réponses ont été présentées, mais il y a encore plus de méthodes: Class.isAssignableFrom() et une tentative simple de transtypage de l'objet (qui peut générer un ClassCastExceptionname__).

Moyens possibles résumés

Résumons les différentes manières de tester si un objet objest une instance de type Cname__:

// 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 la gestion de nullname__

Il y a une différence dans nullen ce qui concerne le traitement:

  • Dans les deux premières méthodes, les expressions sont évaluées à falsesi objest null(nulln'est une instance de rien).
  • La 3ème méthode jetterait évidemment un NullPointerExceptionname__.
  • Les 4ème et 5ème méthodes acceptent au contraire nullcar nullpeut être transtypé en n'importe quel type!

À retenir: nulln'est pas une instance de tout type mais il peut être converti de n'importe quel type.

Remarques

  • Class.getName() ne doit pas être utilisé pour effectuer un "is-instance-of" test parce que l'objet n'est pas de type Cmais une sous-classe de celui-ci, il peut avoir un nom et un package complètement différents (par conséquent, les noms de classe ne correspondront évidemment pas) mais il est toujours de type Cname__.
  • Pour la même raison d'héritage, Class.isAssignableFrom() n'est pas symétrique :
    obj.getClass().isAssignableFrom(C.class) renverrait falsesi le type de objest une sous-classe de Cname__.
154
icza

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 de l'utiliser comme contrôle de flux ou quelque chose de similaire ...

31
Johannes Weiss

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

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

N'importe laquelle des méthodes suggérées conviendra, mais vous devez simplement garder à l'esprit la conception.

24
Yuval Adam

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 que l'objet passera à la variable de référence de l'interface HttpServletRequest.

15
user1884500

Il existe également une méthode .isInstance sur la classe "Classname__". Si vous obtenez la classe d'un objet via myBanana.getClass(), vous pouvez voir si votre objet myAppleest une instance de la même classe que myBananavia

myBanana.getClass().isInstance(myApple)
13
Andreas Petersson

vérifier avec isinstance() ne serait pas suffisant si vous voulez savoir en temps d'exécution. utilisation:

if(someObject.getClass().equals(C.class){
    // do something
}
1
Alon Gouldman