J'ai un objet Java 'ChildObj' qui est étendu de 'ParentObj'. Maintenant, s'il est possible de récupérer tous les noms et valeurs d'attribut de ChildObj, y compris les attributs hérités également, en utilisant le mécanisme de réflexion Java?
Class.getFields me donne le tableau des attributs publics et Class.getDeclaredFields me donne le tableau de tous les champs, mais aucun d'entre eux n'inclut la liste des champs hérités.
Existe-t-il un moyen de récupérer également les attributs hérités?
java
reflection
introspection
Veera
la source
la source
la source
Si à la place vous vouliez vous fier à une bibliothèque pour ce faire, Apache Commons Lang version 3.2+ fournit
FieldUtils.getAllFieldsList
:la source
Vous devez appeler:
Réexécution de la hiérarchie d'héritage si nécessaire.
la source
Utilisez la bibliothèque Reflections:
la source
Les solutions récursives sont OK, le seul petit problème est qu'elles renvoient un sur-ensemble de membres déclarés et hérités. Notez que la méthode getDeclaredFields () renvoie également des méthodes privées. Donc, étant donné que vous parcourez toute la hiérarchie des superclasses, vous incluerez tous les champs privés déclarés dans les superclasses, et ceux-ci ne seront pas hérités.
Un filtre simple avec un Modifier.isPublic || Le prédicat Modifier.isProtected ferait:
la source
Version de travail de la solution "DidYouMeanThatTomHa ..." ci-dessus
la source
Avec la bibliothèque Spring util, vous pouvez utiliser pour vérifier si un attribut spécifique existe dans la classe:
Doc Api:
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/util/ReflectionUtils.html
ou
Doc Api:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ReflectionUtils.html
@à votre santé
la source
Tu peux essayer:
la source
Plus court et avec moins d'objets instanciés? ^^
la source
getFields (): récupère tous les champs publics dans toute la hiérarchie de classe et
getDeclaredFields (): récupère tous les champs, quels que soient leurs modificateurs mais uniquement pour la classe actuelle. Donc, vous devez obtenir pour toute la hiérarchie impliquée.
J'ai récemment vu ce code de org.apache.commons.lang3.reflect.FieldUtils
la source
la source
Ceci est une reformulation de la réponse acceptée par @ user1079877. Il peut s'agir d'une version qui ne modifie pas un paramètre de la fonction et utilise également certaines fonctionnalités Java modernes.
Cette implémentation rend également l'appel un peu plus concis:
la source
Il y a quelques bizarreries qui ne sont pas abordées par FieldUtils - spécifiquement les champs synthétiques (par exemple injectés par JaCoCo) et aussi le fait qu'un type enum a bien sûr un champ pour chaque instance, et si vous parcourez un graphe d'objets, obtenir tous les champs, puis obtenir les champs de chacun d'eux, etc., vous entrerez dans une boucle infinie lorsque vous frapperez une énumération. Une solution étendue (et pour être honnête, je suis sûr que cela doit vivre dans une bibliothèque quelque part!) Serait:
Classe de test dans Spock (et Groovy ajoute des champs synthétiques):
la source