Est-il possible en Java d’accéder aux champs privés par reflection

Est-il possible en Java d’accéder au domaine privé str par reflection? Par exemple pour obtenir la valeur de ce champ.

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

Oui, c’est absolument le cas – en supposant que vous disposez des permissions de sécurité appropriées. Utilisez d’abord Field.setAccessible(true) si vous y accédez depuis une classe différente.

 import java.lang.reflect.*; class Other { private Ssortingng str; public void setStr(Ssortingng value) { str = value; } } class Test { public static void main(Ssortingng[] 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 normalement pas faire ça… c’est renverser les intentions de l’auteur original de la classe. Par exemple, il est possible que la validation soit appliquée dans toute situation où le champ peut normalement être défini, ou d’autres champs peuvent être modifiés en même temps. Vous violez effectivement le niveau d’encapsulation prévu.

Oui.

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

Ensuite, vous utilisez l’object field pour obtenir la valeur sur une instance de la classe.

Notez que get method est souvent déroutant pour les gens. Vous avez le champ, mais vous n’avez pas d’instance de l’object. Vous devez passer cela à la méthode get

Oui c’est possible.

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

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

De plus, vous devez définir ce champ pour qu’il soit accessible si vous souhaitez accéder à un champ privé:

 privateField.setAccessible(true); 

Une fois cela fait, vous pouvez utiliser la méthode get sur l’instance Field pour accéder à la valeur du champ str.