132 votes

Réflexion Java - impact de setAccessible(vrai)

Je suis l'aide de quelques annotations pour définir dynamiquement les valeurs de champs dans les classes. Car je veux faire ce peu importe si c'est public, protected ou private, je suis un appelant setAccessible(true) sur le Champ de l'objet à chaque fois avant d'appeler l' set() méthode. Ma question est quel type d'incidence le setAccessible() appelez sur le champ lui-même?

Plus précisément, dire que c'est un domaine privé et cet ensemble de code appelle setAccessible(true). Si un autre endroit dans le code a été puis de récupérer le même domaine, à travers la réflexion, le champ déjà être accessible? Ou ne l' getDeclaredFields() et getDeclaredField() méthodes de retour de nouvelles instances d'un objet de Champ à chaque fois?

Je suppose une autre façon d'affirmer la question est de savoir si je l'appelle, setAccessible(true), comment est-il important de revenir à la valeur d'origine après je suis fait?

120voto

Moritz Petersen Points 6082

Pourquoi n'essayez-vous pas vous-même ;-)

public class FieldAccessible {
    public static class MyClass {
        private String theField;
    }

    public static void main(String[] args) throws Exception {
        MyClass myClass = new MyClass();
        Field field1 = myClass.getClass().getDeclaredField("theField");
        field1.setAccessible(true);
        System.out.println(field1.get(myClass));
        Field field2 = myClass.getClass().getDeclaredField("theField");
        System.out.println(field2.get(myClass));
    }

}

Donc, pour répondre à votre question: setAccessible() vous permettent de modifier le comportement de l' AccessibleObject, c'est à dire l' Field exemple, mais pas le champ réel de la classe. Voici la documentation (extrait):

Une valeur de true indique que l'objet reflété devrait supprimer du langage Java, accès à la vérification lorsqu'il est utilisé

39voto

Jörn Horstmann Points 18118

L' getDeclaredField méthode doit renvoyer un nouvel objet à chaque fois, exactement parce que cet objet a la mutable accessible drapeau. Donc, il n'est pas nécessaire de réinitialiser l'indicateur. Vous pouvez trouver tous les détails dans cet article de blog.

-1voto

user2252218 Points 1
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class PrivateVariableAcc {

    public static void main(String[] args) throws Exception {
        PrivateVarTest myClass = new PrivateVarTest();
        Field field1 = myClass.getClass().getDeclaredField("a");
        field1.setAccessible(true);
        System.out.println("This is access the private field-"
            + field1.get(myClass));
        Method mm = myClass.getClass().getDeclaredMethod("getA");
        mm.setAccessible(true);
        System.out.println("This is calling the private method-"
            + mm.invoke(myClass, null));
    }

}

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