94 votes

Est-il possible en Java pour accéder aux champs privés via la réflexion

Est-il possible en Java pour accéder domaine privé str via la réflexion? Par exemple, pour obtenir la valeur de ce champ.

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

181voto

Jon Skeet Points 692016

Oui, il est absolument - en supposant que vous avez les autorisations de sécurité appropriés. Utiliser Field.setAccessible(true) d'abord si vous avez accès à partir d'une autre classe.

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);
    }
}

Et non, vous ne devriez pas l'habitude de faire...

53voto

Yishai Points 42417

Oui.

  Field f = Test.class.getDeclaredField("str");
  f.setAccessible(true);//Very important, this allows the setting to work.
  String value = (String) f.get(object);

ensuite, vous utilisez le champ de l'objet pour obtenir la valeur sur une instance de la classe.

Notez que la méthode get est souvent de la confusion pour les gens. Vous avez le champ, mais vous n'avez pas une instance de l'objet. Vous devez passer que pour la méthode get

5voto

pythonquick Points 4314

Oui c'est possible.

Vous devez utiliser le getDeclaredField méthode (au lieu de la méthode getField), avec le nom de votre domaine privé:

Field privateField = Test.class.getDeclaredField("str");

En outre, vous avez besoin de définir ce Champ pour être accessible, si vous souhaitez accéder à un champ privé:

privateField.setAccessible(true);

Une fois cela fait, vous pouvez utiliser la méthode get sur le Champ exemple, pour accéder à la valeur de la str champ.

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