Ich spiele mit der Java-Reflektions-API herum und versuche, einige Felder zu behandeln. Jetzt bin ich dabei, den Typ meiner Felder zu identifizieren. Strings sind einfach, tun Sie einfach myField.getType().equals(String.class)
. Gleiches gilt für andere nicht abgeleitete Klassen. Aber wie überprüfe ich abgeleitete Klassen? Z.B. LinkedList
als Unterklasse von List
. Ich kann keine isSubclassOf(...)
oder extends(...)
Methode finden. Muss ich alle getSuperClass()
durchgehen und meine eigene Klasse selbst finden?Überprüfen Sie, ob eine Klasse eine Unterklasse einer anderen Klasse in Java ist
Antwort
Sie wollen diese Methode:
:
boolean isList = List.class.isAssignableFrom(myClass);
im Allgemeinen, wo
List
(oben) sollte sollte mitsubclass
Vom JavaDoc ersetzt werden mit
superclass
undmyClass
ersetzt werden Bestimmt, ob die durch diesesClass
Objekt repräsentierte Klasse oder Schnittstelle entweder th ist Dieselbe oder eine Superklasse oder Superschnittstelle der Klasse oder Schnittstelle, die durch den spezifizierten ParameterClass
repräsentiert wird. Es gibttrue
wenn ja; Andernfalls gibt esfalse
zurück. Wenn diesesClass
Objekt einen primitiven Typ darstellt, gibt diese Methodetrue
zurück, wenn der angegebeneClass
Parameter genau diesesClass
Objekt ist; Andernfalls gibt esfalse
zurück.
Referenz:
Verwandte:
a) Überprüfen Sie, ob ein Objekt eine Instanz einer Klasse oder Schnittstelle (einschließlich Subklassen) wissen Sie bei der Kompilierung:
boolean isInstance = someObject instanceof SomeTypeOrInterface;
Beispiel:
assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>);
b) Überprüfen Sie, ob ein Objekt eine Instanz einer Klasse oder Schnittstelle (einschließlich Unterklassen) ist nur Sie zur Laufzeit kennen:
Class<?> typeOrInterface = // acquire class somehow
boolean isInstance = typeOrInterface.isInstance(someObject);
Beispiel:
public boolean checkForType(Object candidate, Class<?> type){
return type.isInstance(candidate);
}
Beachte das Schema: 'SUPERCLASS.isAssignableFrom (SUBCLASS)' Das hat mich zuerst verwirrt, obwohl es in Anbetracht der Namensgebung offensichtlich ist. – codepleb
@TrudleR Ich stimme zu. Etwas wie 'SUPERCLASS.isExtendedBy (SUBCLASS)' wäre viel einfacher zu verstehen –
@SeanPatrickFloyd tatsächlich 'isExtendedBy' ist ein schlechter Name als' CLASS.isAssignableFrom (CLASS) 'wäre wahr (und daher' CLASS.isExtendedBy (CLASS) ') auch). Das wäre nicht das, was ich erwartet hatte. – Qw3ry
Eine weitere Option ist instanceof:
Object o =...
if (o instanceof Number) {
double d = ((Number)o).doubleValue(); //this cast is safe
}
Guter Anruf (+1). Und dann gibt es noch die Kombination der beiden Mechanismen: 'Class.isInstance (Objekt)' http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#isInstance%28java. lang.Object% 29 –
Dies würde bedeuten, dass Sie das "Feld" instanziieren. Aber ich will nur meine Klasse und ihre Felder "sehen", will sie nicht "ausprobieren". – craesh
Ich sehe diese Methode viel sauberer und klarer als die Methode "isAssignableFrom", falls Sie den Vererbungsbaum eines Objekts überprüfen müssen. – cbuchart
Instanceof Arbeiten auf Instanzen, das heißt auf Objekte. Manchmal möchten Sie direkt mit Klassen arbeiten. In diesem Fall können Sie die Methode asSubClass der Klasse Class verwenden. Einige Beispiele:
1)
Class o=Object.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
dies durch reibungslos, weil JFrame Unterklasse von Object ist. c enthält ein Klassenobjekt, das die JFrame-Klasse darstellt.
2)
Class o=JButton.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
dies startet ein java.lang.ClassCastException weil JFrame NICHT Unterklasse von JButton ist. c wird nicht initialisiert.
3)
Class o=Serializable.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
dies durch reibungslos, weil JFrame den java.io.Serializable-Schnittstelle implementiert. c enthält ein Klassenobjekt, das die JFrame-Klasse darstellt.
Natürlich müssen die benötigten Importe enthalten sein.
Dies funktioniert für mich:
protected boolean isTypeOf(String myClass, Class<?> superClass) {
boolean isSubclassOf = false;
try {
Class<?> clazz = Class.forName(myClass);
if (!clazz.equals(superClass)) {
clazz = clazz.getSuperclass();
isSubclassOf = isTypeOf(clazz.getName(), superClass);
} else {
isSubclassOf = true;
}
} catch(ClassNotFoundException e) {
/* Ignore */
}
return isSubclassOf;
}
Funktioniert gut, aber Sie müssen möglicherweise einen Null-Test nach clazz = clazz.getSuperclass() hinzufügen, falls Sie java.lang.Object treffen, das keine Super-Klasse hat. –
A recrursive Methode zu überprüfen, ob ein clazz ein "Kind" eines übergeordneten Klasse ist ...
Verbesserte Version von @ To_Kra Antwort:
protected boolean isSubclassOf(Class<?> clazz, Class<?> superClass) {
if (superClass.equals(Object.class)) {
// Every class is an Object.
return true;
}
if (clazz.equals(superClass)) {
return true;
} else {
clazz = clazz.getSuperclass();
// every class is Object, but superClass is below Object
if (clazz.equals(Object.class)) {
// we've reached the top of the hierarchy, but superClass couldn't be found.
return false;
}
// try the next level up the hierarchy.
return isSubclassOf(clazz, superClass);
}
}
Dies ist eine verbesserte Version von @ schutteks Antwort. Es wird verbessert, da es für Primitive korrekt false zurückgibt (z. B. isSubclassOf (int.class, Object.class) => false) und Schnittstellen auch korrekt verarbeitet (z. B. isSubclassOf (HashMap.class, Map.class) => true).
static public boolean isSubclassOf(final Class<?> clazz, final Class<?> possibleSuperClass)
{
if (clazz == null || possibleSuperClass == null)
{
return false;
}
else if (clazz.equals(possibleSuperClass))
{
return true;
}
else
{
final boolean isSubclass = isSubclassOf(clazz.getSuperclass(), possibleSuperClass);
if (!isSubclass && clazz.getInterfaces() != null)
{
for (final Class<?> inter : clazz.getInterfaces())
{
if (isSubclassOf(inter, possibleSuperClass))
{
return true;
}
}
}
return isSubclass;
}
}
- 1. Wie kann man feststellen, ob eine Klasse eine Unterklasse einer anderen Klasse ist?
- 2. Testen, ob eine Klasse eine Unterklasse einer anderen Klasse in Lisp ist
- 3. Testen, ob eine Ruby-Klasse eine Unterklasse einer anderen Klasse ist
- 4. Überprüfen Sie, ob ein Objekt eine Instanz einer Klasse ist (aber nicht eine Instanz seiner Unterklasse)
- 5. AS3 - Kann ich wissen, ob eine Klasse eine Schnittstelle implementiert (oder eine Unterklasse einer anderen Klasse ist)?
- 6. Überprüfen Sie, ob eine Klasse existiert
- 7. überprüfen Sie, ob eine Eigenschaft in einer Klasse existiert
- 8. überprüfen, ob Element eine Instanz einer generischen Klasse ist
- 9. Machen Sie eine Klasse eine Instanz einer anderen Klasse
- 10. Überprüfen Sie, ob eine Methode in einer erweiterten Klasse, aber nicht in einer übergeordneten Klasse existiert
- 11. TypeScript - Überprüfen, ob Klasse eine Schnittstelle implementiert
- 12. Wie verwendet eine Klasse eine Methode, die in Java in einer anderen Klasse definiert ist?
- 13. Java - Wie kann ich überprüfen, ob eine Klasse von einer Klasse oder einer Schnittstelle geerbt wird?
- 14. Überprüfen Sie, ob eine Klasse eine Methode hat
- 15. Testen Sie, ob eine Klasse polymorph ist
- 16. Was verbindet 2 Klassen in 1 Klasse, wo eine Klasse eine Unterklasse des anderen genannt wird?
- 17. jQuery überprüfen, ob Element eine Klasse hat
- 18. Überprüfen, ob das Kontrollkästchen eine Klasse hat und aktiviert ist
- 19. Überprüfen Sie, ob ein Wahrheitswert aus einer anderen Java-Klasse wahr ist
- 20. Wie überprüft man, ob eine Unterklasse zur Laufzeit eine Instanz einer Klasse ist?
- 21. PHP: instanziieren Sie eine Klasse und Methoden einer anderen Klasse
- 22. C# test, wenn eine Klasse ein Subtyp einer anderen Klasse ist
- 23. Unterklasse "ist" Klasse verwirrt mich
- 24. Kann ich auf eine Unterklasse in einer anderen Unterklasse verweisen?
- 25. Java Benutzereingaben gegen Variablen in einer anderen Klasse überprüfen
- 26. Überprüfen, ob eine Klasse eine Funktion hat, die Parameter enthält
- 27. Unterklasse eine C++ - abstrakte Klasse in Java mit JNI
- 28. Überprüfen Sie, ob eine DLL-Bibliothek bereits geladen ist? (Java)
- 29. Überprüfen Sie, ob ein Vorgänger eine Klasse mit jQuery hat
- 30. RegEx - Überprüfen Sie, ob eine Zeichenfolge innerhalb SPAN-Tag einer bestimmten CSS-Klasse ist da?
'LinkedList' ist keine Unterklasse von' List'. Es ist eine * Implementierung * von 'List'. –
* Untertyp * könnte ein besserer Begriff sein – jpaugh