Maison  >  Article  >  Java  >  Java Reflection peut-il contourner l’encapsulation pour accéder aux champs privés ?

Java Reflection peut-il contourner l’encapsulation pour accéder aux champs privés ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 20:11:29249parcourir

Can Java Reflection Bypass Encapsulation to Access Private Fields?

Champs privés accessibles via la réflexion Java

L'accès aux champs privés via la réflexion est un sujet débattu dans la programmation Java. Avec cette technique, on peut contourner les restrictions d'accès imposées par l'encapsulation et récupérer les valeurs des champs privés, soulevant des inquiétudes quant à la violation des principes d'encapsulation.

Considérons l'exemple suivant :

class Test
{
    private String str;
    public void setStr(String value)
    {
        str = value;
    }
}

La question se pose : Est-il possible d'obtenir la valeur du champ privé 'str' par réflexion ?

Réponse :

Oui, c'est est en effet possible, à condition que les autorisations de sécurité appropriées soient accordées. En utilisant la méthode Field.setAccessible(true), vous pouvez accorder l'accès à un champ privé à partir d'une classe différente.

L'extrait de code suivant montre comment y parvenir :

import java.lang.reflect.*;

class Other
{
    private String str;
    public void setStr(String value)
    {
        str = value;
    }
}

class Test
{
    public static void main(String[] args)
        // Just for the ease of a throwaway test. Don't
        // do this normally!
        throws Exception
    {
        Other t = new Other();
        t.setStr("hi");
        Field field = Other.class.getDeclaredField("str");
        field.setAccessible(true);
        Object value = field.get(t);
        System.out.println(value);
    }
}

Attention :

Il est fortement déconseillé d'accéder aux champs privés dans des scénarios typiques. Ce faisant, vous ignorez les mécanismes d'encapsulation de la classe, annulant potentiellement les contrôles de validation essentiels ou modifiant d'autres champs de manière inattendue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn