Ich spiele mit Javas Reflection API herum und versuche, mit einigen Feldern umzugehen. Jetzt bin ich nicht mehr in der Lage, den Typ meiner Felder zu identifizieren. Saiten sind einfach, machen Sie es einfach myField.getType().equals(String.class)
. Gleiches gilt für andere nicht abgeleitete Klassen. Aber wie überprüfe ich abgeleitete Klassen? ZB LinkedList
als Unterklasse von List
. Ich kann keine isSubclassOf(...)
oder extends(...)
Methode finden. Muss ich durch alles gehen getSuperClass()
und meine Oberklasse selbst finden?
java
class
reflection
Craesh
quelle
quelle
LinkedList
ist keine Unterklasse vonList
. Es ist eine Implementierung vonList
.Antworten:
Sie möchten diese Methode:
wo in der Regel
List
( siehe oben) sollte ersetzt werdensuperclass
undmyClass
sollte ersetzt werden durchsubclass
Aus dem JavaDoc :
Referenz:
Class.isAssignableFrom(Class)
Verbunden:
a) Überprüfen Sie, ob ein Objekt eine Instanz einer Klasse oder Schnittstelle (einschließlich Unterklassen) ist, die Sie zur Kompilierungszeit kennen:
Beispiel:
b) Überprüfen Sie, ob ein Objekt eine Instanz einer Klasse oder Schnittstelle (einschließlich Unterklassen) ist, die Sie nur zur Laufzeit kennen:
Beispiel:
quelle
SUPERCLASS.isAssignableFrom(SUBCLASS)
Dies verwirrte mich zuerst, obwohl es angesichts der Benennung tatsächlich offensichtlich ist.SUPERCLASS.isExtendedBy(SUBCLASS)
wäre viel einfacher zu verstehenisExtendedBy
ein schlechter Name, wieCLASS.isAssignableFrom(CLASS)
es wahr wäre (und daherCLASS.isExtendedBy(CLASS)
auch). Das würde ich nicht erwarten.Eine andere Option ist Instanz von:
quelle
Class.isInstance(object)
download.oracle.com/javase/6/docs/api/java/lang/…Field
. Aber ich möchte nur meine Klasse und ihre Felder "anschauen", nicht "ausprobieren".instanceof
auch für Eltern (in diesem FallNumber
) selbst nicht nur Kinderinstanceof arbeitet mit Instanzen, dh mit Objekten. Manchmal möchten Sie direkt mit Klassen arbeiten. In diesem Fall können Sie die asSubClass verwenden Methode der Class-Klasse verwenden. Einige Beispiele:
1)
Dies läuft reibungslos ab, da JFrame eine Unterklasse von Object ist. c enthält ein Class-Objekt, das die JFrame-Klasse darstellt.
2)
Dadurch wird eine java.lang.ClassCastException gestartetDadurch wird gestartet, da JFrame NICHT die Unterklasse von JButton ist. c wird nicht initialisiert.
3)
Dies wird reibungslos ablaufen, da JFrame die Schnittstelle java.io.Serializable implementiert. c enthält ein Class-Objekt, das die JFrame-Klasse darstellt.
Natürlich müssen die benötigten Importe einbezogen werden.
quelle
Das funktioniert bei mir:
quelle
Dies ist eine verbesserte Version der Antwort von @ schuttek. Es wurde verbessert, weil es für Grundelemente korrekt false zurückgibt (z. B. isSubclassOf (int.class, Object.class) => false) und auch Schnittstellen korrekt verarbeitet (z. B. isSubclassOf (HashMap.class, Map.class) => true).
quelle
Eine rekursive Methode, um zu überprüfen, ob a
Class<?>
eine Unterklasse einer anderenClass<?>
...Verbesserte Version des @An Kra ‚s Antwort :
quelle
//Erbe
// Methoden
// Teste den Code
//Ergebnis
quelle