117 votes

Accès à des champs privés héritées par réflexion en Java

J’ai créé un moyen d’obtenir des membres hérités via et accéder aux membres privés via mais je cherche des champs hérités privés. Comment est-ce que je peux réaliser cela ?

135voto

aioobe Points 158466

Cela devrait démontrer comment le résoudre :

Sortie :

46voto

Sean Patrick Floyd Points 109428

La meilleure approche ici est d'utiliser le Modèle Visiteur ne trouvez tous les champs de la classe et toutes les super-classes et d'exécuter un rappel de l'action.


La mise en œuvre

Le printemps est une belle classe Utilitaire ReflectionUtils qui ne fait que cela: il définit une méthode pour faire une boucle sur tous les champs de toutes les super-classes avec un rappel: ReflectionUtils.doWithFields()

Documentation:

Invoquer le rappel sur tous les champs de la classe cible, en remontant la hiérarchie de classe pour obtenir de déclarer tous les domaines.

Paramètres:
- clazz - la classe cible à analyser
- fc - la fonction de rappel à appeler pour chaque champ
- ff - le filtre qui détermine les champs d'appliquer la fonction de rappel de

Exemple de code:

ReflectionUtils.doWithFields(RoleUnresolvedList.class,
    new FieldCallback(){

        @Override
        public void doWith(final Field field) throws IllegalArgumentException,
            IllegalAccessException{

            System.out.println("Found field " + field + " in type "
                + field.getDeclaringClass());

        }
    },
    new FieldFilter(){

        @Override
        public boolean matches(final Field field){
            final int modifiers = field.getModifiers();
            // no static fields please
            return !Modifier.isStatic(modifiers);
        }
    });

Sortie:

Trouvé le terrain privé transitoire boolean javax.de la gestion.relation.RoleUnresolvedList.typeSafe dans le type de la classe javax.de la gestion.relation.RoleUnresolvedList
Trouvé le terrain privé transitoire boolean javax.de la gestion.relation.RoleUnresolvedList.salies de type de la classe javax.de la gestion.relation.RoleUnresolvedList
Trouvé le terrain privé transitoire java.lang.Object[] java.util.Liste de tableaux.elementData dans le type de classe java.util.ArrayList
Trouvé champ private int java.util.Liste de tableaux.la taille du type de la classe java.util.ArrayList
Trouve protégé du champ de transitoire int java.util.AbstractList.modCount dans le type de classe java.util.AbstractList

37voto

jqno Points 7831

Cela va le faire :

Si vous utilisez un outil de couverture de code comme EclEmma, vous avez à surveiller : ils ajoutent un champ masqué à chacune de vos classes. Dans le cas de EclEmma, ces champs sont marqués synthétique, et vous pouvez les filtrer comme ceci :

20voto

Exterminator13 Points 894
<pre><code></code><p><a href="http://stackoverflow.com/a/3585132/676369">cette</a> réponse)</p></pre>

15voto

BenZen Points 796

En fait, j’utilise une hiérarchie de type complexe donc vous solution n’est pas terminée. J’ai besoin d’appeler un récursif pour obtenir tous les champs hérités privés. Voici ma solution

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X