Wie teste ich, ob eine Java-Klasse zur Laufzeit eine andere erweitert?

131

Wie teste ich, ob aes sich um eine Unterklasse von handelt b?

Class<?> a = A.class;
Class<?> b = B.class;
Armand
quelle

Antworten:

255

Suchen Sie:

Super.class.isAssignableFrom(Sub.class)
Meriton
quelle
84

Wenn Sie wissen möchten, ob ein Classanderer erweitert wird, verwenden Sie Class # isAssignableFrom (Class) . Für Ihr Beispiel wäre es:

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

Wenn Sie daran interessiert sind, ob eine Instanz von einem bestimmten Typ ist oder nicht, verwenden Sie instanceof:

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

Beachten Sie, dass diese zurückgegeben werden, truewenn die Klasse / Instanz Mitglied der Typhierarchie ist und nicht auf direkte Beziehungen zwischen Oberklassen und Unterklassen beschränkt ist. Beispielsweise:

// 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

Wenn Sie nach direkten Beziehungen zwischen Oberklassen und Unterklassen suchen möchten, hat Tim ebenfalls eine Antwort gegeben .

Rob Hruska
quelle
2
Eigentlich ist es B.class.isAssignableFrom (A.class), da er wissen will, ob A eine Unterklasse von B. ist
Meriton
1
Ah ja, das werde ich ändern. Normalerweise sind Beispiele umgekehrt (B erweitert A).
Rob Hruska
tricked ya ;-p Vielen Dank für die ausführliche Antwort; Ich akzeptiere jedoch Meritons, da es die klarste IMO ist.
Armand
42

Sie möchten wissen, ob b zuweisbar ist von a :

b.isAssignableFrom(a);

Wenn Sie wissen möchten, dass dies aeine direkte Unterklasse von b:

a.getSuperclass().equals(b);
Tim Stone
quelle
Danke für die Antwort und danke für die Verwendung aund bvon der Frage
Armand