Je suis un peu confus sur la différence entre la getFields
méthode et la getDeclaredFields
méthode lors de l'utilisation de la réflexion Java.
J'ai lu que cela getDeclaredFields
vous donne accès à tous les champs de la classe et qui getFields
ne renvoie que les champs publics. Si tel est le cas, pourquoi ne l'utiliseriez-vous pas toujours getDeclaredFields
?
Quelqu'un peut-il expliquer cela et expliquer la différence entre les deux méthodes, et quand / pourquoi voudriez-vous utiliser l'une par rapport à l'autre?
java
reflection
NoirChapeauSamouraï
la source
la source
getField
peut obtenir un champ hérité d'une superclasse maisgetDeclaredField
ne le peut pas.getDeclaredField
se limiter à la classe sur laquelle vous appelez la fonction.getField
ne peut pas accéder aux membres privésRéponses:
getFields ()
Tous les
public
champs dans toute la hiérarchie des classes.getDeclaredFields ()
Tous les champs, quelle que soit leur accessibilité, mais uniquement pour la classe actuelle, pas les classes de base dont la classe actuelle pourrait hériter.
Pour faire remonter tous les champs dans la hiérarchie, j'ai écrit la fonction suivante:
La
exclusiveParent
classe est fournie pour empêcher la récupération des champs à partir deObject
. Il se peutnull
que vous vouliez lesObject
champs.Pour clarifier,
Lists.newArrayList
vient de la goyave.Mettre à jour
Pour info, le code ci-dessus est publié sur GitHub dans mon projet LibEx dans ReflectionUtils .
la source
Field#get
et des méthodes similaires. En d'autres termes, cette approche ne permet pas à la classe actuelle d'accéder à l'interface privée de sa superclasse, de la même manière que la compilation typique ne le fait pas.setAccessible
et qu'il n'y a pas de gestionnaire de sécurité en placeprivate
champs ne sont accessibles que viagetDeclaredFields
qui est spécifique à la classe. Chaque champ (même avec le même type et le même nom) serait desField
instances distinctes .Comme déjà mentionné,
Class.getDeclaredField(String)
ne regarde que les champsClass
dans lesquels vous l'appelez.Si vous souhaitez rechercher un
Field
dans laClass
hiérarchie, vous pouvez utiliser cette fonction simple:Ceci est utile pour trouver un
private
champ d'une superclasse, par exemple. De plus, si vous souhaitez modifier sa valeur, vous pouvez l'utiliser comme ceci:la source
try try { field = clazz.getDeclaredField(name); } catch (NoSuchFieldException e) { clazz = clazz.getSuperclass(); if(clazz==null){ throw e; } }
public Field[] getFields() throws SecurityException
Renvoie un tableau contenant des objets Field reflétant tous les champs publics accessibles de la classe ou de l'interface représentée par cet objet Class. Les éléments du tableau renvoyés ne sont pas triés et ne sont pas dans un ordre particulier. Cette méthode retourne un tableau de longueur 0 si la classe ou l'interface n'a pas de champs publics accessibles, ou si elle représente une classe de tableau, un type primitif ou void.
Plus précisément, si cet objet Class représente une classe, cette méthode retourne les champs publics de cette classe et de toutes ses superclasses. Si cet objet Class représente une interface, cette méthode retourne les champs de cette interface et de toutes ses super-interfaces.
Le champ de longueur implicite pour la classe de tableau n'est pas reflété par cette méthode. Le code utilisateur doit utiliser les méthodes de la classe Array pour manipuler les tableaux.
public Field[] getDeclaredFields() throws SecurityException
Renvoie un tableau d'objets Field reflétant tous les champs déclarés par la classe ou l'interface représentée par cet objet Class. Cela inclut les champs public, protégé, par défaut (package) et privé , mais exclut les champs hérités . Les éléments du tableau renvoyés ne sont pas triés et ne sont pas dans un ordre particulier. Cette méthode renvoie un tableau de longueur 0 si la classe ou l'interface ne déclare aucun champ, ou si cet objet Class représente un type primitif, une classe de tableau ou void.
Et si j'ai besoin de tous les champs de toutes les classes parentes? Un certain code est nécessaire, par exemple à partir de https://stackoverflow.com/a/35103361/755804 :
la source
À partir des didacticiels Java Reflection :
la source