Überprüfen Sie, ob ein Objekt der Klasse ist Unterklasse einer anderen Klasse Object in Java
Ich bin Herumspielen mit der Java-reflection-API und zu meistern versucht einige Felder. Jetzt bin ich stecken mit der Identifizierung der Art von meinen Feldern. Strings sind einfach nur tun myField.getType().equals(String.class)
. Das gleiche gilt für andere nicht-abgeleiteten Klassen. Aber wie kann ich prüfen, ob abgeleitete Klassen? E. g. LinkedList
als Unterklasse von List
. Ich finde keine isSubclassOf(...)
oder extends(...)
Methode. Brauche ich zu Fuß durch alle getSuperClass()
und finde meinen supeclass durch meine eigenen?
LinkedList
ist nicht eine Unterklasse vonList
. Es ist eine Implementierung vonList
.- Sub-Typ könnte ein besserer Begriff
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie diese Methode:
wo im Allgemeinen
List
(oben) sollten ersetzt werden mitsuperclass
undmyClass
sollte ersetzt werden, mitsubclass
Aus der JavaDoc:
Referenz:
- Klasse.isAssignableFrom(Class)
Verwandte:
a) Prüfen, ob ein Objekt eine Instanz einer Klasse oder Schnittstelle (einschließlich Unterklassen), die Sie kennen, zur compile-Zeit:
Beispiel:
b) Überprüfen, ob ein Objekt eine Instanz einer Klasse oder Schnittstelle (einschließlich Unterklassen) Sie wissen nur zur Laufzeit:
Beispiel:
SUPERCLASS.isAssignableFrom(SUBCLASS)
Dies verwirrte mich zuerst, obwohl es eigentlich offensichtlich, bedenkt man die Namensgebung.SUPERCLASS.isExtendedBy(SUBCLASS)
wäre viel einfacher zu verstehenisExtendedBy
ist der name schlecht alsCLASS.isAssignableFrom(CLASS)
wäre wahr (und deshalbCLASS.isExtendedBy(CLASS)
auch). Dies wäre nicht das, was ich erwartet hatte.Weitere option ist instanceof:
Class.isInstance(object)
download.oracle.com/javase/6/docs/api/java/lang/...Field
. Aber ich will nur den "Blick" auf meine Klasse und die Felder nicht wollen, um "mal auszuprobieren".instanceof
funktioniert auch für Eltern (in diesem FallNumber
) sich nicht nur Kinderinstanceof arbeitet auf Instanzen, d.h. auf Objekte. Manchmal wollen Sie arbeiten direkt mit den Klassen. In diesem Fall können Sie die asSubClass - Methode der class-Klasse.
Einige Beispiele:
1)
dieser wird Durchlaufen, reibungslos, denn JFrame ist eine Unterklasse von Object. c enthalten, ein Klasse Objekt, das die JFrame-Klasse.
2)
damit starten Sie eine java.lang.Classcastexception-Fehler denn JFrame ist NICHT Unterklasse von JButton. c nicht initialisiert werden.
3)
gehen wird, durch drehen, weil JFrame implements java.io.Serializable-Schnittstelle. c enthalten, ein Klasse Objekt, das die JFrame-Klasse.
Natürlich die benötigten Importe mit einbezogen werden.
Diese funktioniert bei mir:
Dies ist eine verbesserte version von @schuttek Antwort. Es wird verbessert, da es richtig return false für primitive (z.B. isSubclassOf(int.class, Object.class) => false) und auch korrekt verarbeitet Schnittstellen (z.B. isSubclassOf(HashMap.class, Map.class) => true).
Einer rekursiven Methode um zu überprüfen, ob eine
Class<?>
ist eine sub-Klasse von einer anderenClass<?>
...Verbesserte version von @An Kra's Antwort:
//Vererbung
//Methoden
//Test-code
//Ergebnis