Comment tester si une classe Java en étend une autre au moment de l'exécution?

Réponses:

255

Cherchez-vous:

Super.class.isAssignableFrom(Sub.class)
meriton
la source
84

Si vous voulez savoir si un en Classétend ou non un autre, utilisez Class # isAssignableFrom (Class) . Pour votre exemple, ce serait:

if(B.class.isAssignableFrom(A.class)) { ... }

Si vous souhaitez savoir si une instance est ou non d'un type particulier, utilisez instanceof:

A obj = new A();
if(obj instanceof B) { ... }

Notez que ceux-ci seront renvoyés truesi la classe / instance est membre de la hiérarchie des types et ne sont pas restrictives pour les relations directes superclasse / sous-classe. Par exemple:

// if A.class extends B.class, and B.class extends C.class
C.class.isAssignableFrom(A.class); // evaluates to true
// ...and...
new A() instanceof C; // evaluates to true

Si vous voulez vérifier les relations directes superclasse / sous-classe, Tim a également fourni une réponse .

Rob Hruska
la source
2
En fait, il B.class.isAssignableFrom (A.class), puisqu'il veut savoir si A est une sous-classe de B.
meriton
1
Ah oui, je vais changer ça. Habituellement, les exemples sont inversés (B prolongeant A).
Rob Hruska
vous a trompé ;-p Merci beaucoup pour la réponse détaillée; J'accepte cependant celui de Meriton, car c'est l'OMI la plus claire.
Armand
42

Vous voulez savoir si b est attribuable à partir de a :

b.isAssignableFrom(a);

De plus, si vous voulez savoir qu'il as'agit d'une sous-classe directe de b:

a.getSuperclass().equals(b);
Tim Stone
la source
merci pour la réponse, et merci d'utiliser aet bde la question
Armand