43 votes

Pourquoi est-il autorisé à accéder aux champs privés Java via réflexion?

Considérons cet exemple:

 import java.lang.reflect.Field;

public class Test {

    public static void main(String[] args) {
        C c = new C();
        try {
            Field f = C.class.getDeclaredField("a");
            f.setAccessible(true);
            Integer i = (Integer)f.get(c);
            System.out.println(i);
        } catch (Exception e) {}
    }
}

class C {
    private Integer a =6;
}
 

Il semble illogique que vous soyez autorisé à accéder à des champs de classes privés avec réflexion. Pourquoi une telle fonctionnalité est-elle disponible? N'est-il pas "dangereux" d'autoriser un tel accès?

58voto

jcoder Points 14982

Privé est destiné à prévenir les utilisations abusives accidentelles et non comme un mécanisme de sécurité Si vous choisissez de le contourner, vous pouvez le faire à vos risques et périls et en partant du principe que vous savez ce que vous faites.

22voto

Joachim Sauer Points 133411

Les deux getDeclaredField() et setAccessible() sont réellement vérifiés par le responsable de la sécurité et lève une exception lorsque votre code n'est pas autorisé à le faire. Le plus souvent, vous ne le remarquerez pas, car le code Java est souvent exécuté sans gestionnaire de sécurité.

Les exceptions sont une exception importante: elles sont toujours exécutées avec un gestionnaire de sécurité.

10voto

pjp Points 7012

Oui c'est pas gentil, mais il ne permet pas de frameworks tels que la Sérialisation Java pour fonctionner.

Réglage de l'accessibles drapeau dans un objet réfléchi permet des applications sophistiquées, avec suffisamment de privilèges, tels que Java Sérialisation d'un Objet ou d'autres mécanismes de persistance, de manipuler les objets d'une manière qui seraient normalement interdites.

Je crois que la fonctionnalité peut être désactivée par l' SecurityManager

http://javabeans.asia/2008/10/12/how_to_set_securitymanager_and_java_security_policy_programmatically.html

8voto

Kevin Montrose Points 11936

La réflexion est dangereuse. Période.

À quoi sert-il de limiter l'utilité d'un système vraiment dangereux pour une sécurité légèrement accrue?

De plus, la sérialisation automatisée nécessite la capacité "d'aspirer le cerveau" de n'importe quelle classe; ignorer les modificateurs d'accès est une nécessité dans ce cas.

4voto

Nelson Points 3878

Reflection est une API complète pour accéder aux classes. Membres privés et tous.

Dans les cas où vous ne faites pas confiance au code que vous utilisez (applets, etc.), vous pouvez empêcher le code d'utiliser la réflexion. Voir cette question de débordement de pile pour plus de détails.

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