Je joue avec l'API de réflexion de Java et j'essaie de gérer certains champs. Maintenant, je suis obligé d'identifier le type de mes champs. Les cordes sont faciles, faites-le myField.getType().equals(String.class)
. Il en va de même pour les autres classes non dérivées. Mais comment vérifier les classes dérivées? Par exemple, en LinkedList
tant que sous-classe de List
. Je ne trouve aucune méthode isSubclassOf(...)
ni aucune extends(...)
méthode. Dois-je parcourir tout getSuperClass()
et trouver ma superclass par moi-même?
java
class
reflection
fou
la source
la source
LinkedList
n'est pas une sous-classe deList
. C'est une implémentation deList
.Réponses:
Vous voulez cette méthode:
où en général,
List
(ci-dessus) doit être remplacé parsuperclass
etmyClass
doit être remplacé parsubclass
À partir du JavaDoc :
Référence:
Class.isAssignableFrom(Class)
En relation:
a) Vérifiez si un objet est une instance d'une classe ou d'une interface (y compris les sous-classes) que vous connaissez au moment de la compilation:
Exemple:
b) Vérifiez si un objet est une instance d'une classe ou d'une interface (y compris les sous-classes) que vous ne connaissez qu'au moment de l'exécution:
Exemple:
la source
SUPERCLASS.isAssignableFrom(SUBCLASS)
Cela m'a d'abord confondu, bien que cela soit en fait évident compte tenu de la dénomination.SUPERCLASS.isExtendedBy(SUBCLASS)
serait beaucoup plus facile à comprendreisExtendedBy
est en fait un mauvais nom comme ceCLASS.isAssignableFrom(CLASS)
serait vrai (et doncCLASS.isExtendedBy(CLASS)
aussi). Ce ne serait pas ce à quoi je m'attendais.Une autre option est instanceof:
la source
Class.isInstance(object)
download.oracle.com/javase/6/docs/api/java/lang/...Field
. Mais je veux juste "regarder" ma classe et ses champs, je ne veux pas "les essayer".instanceof
fonctionne également pour le parent (dans ce casNumber
) lui-même non seulement pour les enfantsinstanceof fonctionne sur des instances, c'est-à-dire sur des objets. Parfois, vous souhaitez travailler directement avec les classes. Dans ce cas, vous pouvez utiliser asSubClass méthode de la classe Class. Quelques exemples:
1)
cela se déroulera sans problème car JFrame est une sous-classe d'Object. c contiendra un objet Class représentant la classe JFrame.
2)
cela lancera une exception java.lang.ClassCastException exception car JFrame n'est PAS une sous-classe de JButton. c ne sera pas initialisé.
3)
cela se passera sans problème car JFrame implémente l'interface java.io.Serializable. c contiendra un objet Class représentant la classe JFrame.
Bien entendu, les importations nécessaires doivent être incluses.
la source
Cela fonctionne pour moi:
la source
Ceci est une version améliorée de la réponse de @ schuttek. Il est amélioré car il renvoie correctement false pour les primitives (par exemple isSubclassOf (int.class, Object.class) => false) et gère également correctement les interfaces (par exemple isSubclassOf (HashMap.class, Map.class) => true).
la source
Une méthode récursive pour vérifier si a
Class<?>
est une sous-classe d'une autreClass<?>
...Version améliorée de la réponse de @To Kra :
la source
//Héritage
// Méthodes
// Tester le code
//Résultat
la source