En Java, une méthode de setAccessible (true) utilisant la réflexion est largement connue comme un moyen de modifier la valeur d'un champ privé qui est normalement inaccessible de l'extérieur.
Nous allons vous montrer comment appliquer cette méthode pour changer dynamiquement le champ final.
Main.java
public class Main {
public static void main(String[] args) throws Exception {
TargetClass clazz = new TargetClass();
System.out.println("Avant la mise à jour: " + clazz.getTargetField()); // Avant la mise à jour: 1
Field targetField = clazz.getClass().getDeclaredField("TARGET_FIELD"); //Obtenez l'objet Field pour que l'accès soit mis à jour.
Field modifiersField = Field.class.getDeclaredField("modifiers"); //La classe Field utilise des modificateurs pour déterminer l'accès au champ auquel accéder, alors mettez-le à jour.
modifiersField.setAccessible(true); //Puisque les modificateurs eux-mêmes sont privés, rendez-les accessibles.
modifiersField.setInt(targetField,
targetField.getModifiers() & ~Modifier.PRIVATE & ~Modifier.FINAL); //Supprimez privé et final des modificateurs de l'objet Field pour accéder à la cible de mise à jour.
targetField.set(null, 1000); //Mise à jour de la valeur: 1 -> 1000
System.out.println("_Personnes Personnes Personnes Personnes_"); // _Personnes Personnes Personnes Personnes_
System.out.println("Après la mise à jour: > " + clazz.getTargetField() + " <"); // Après la mise à jour: > 1000 <
System.out.println("  ̄Y^Y^Y^Y ̄"); //  ̄Y^Y^Y^Y ̄
}
}
TargetClass.java
public class TargetClass {
private static final Integer TARGET_FIELD = 1;
public Integer getTargetField() {
return TARGET_FIELD;
}
}
Dans un environnement où Security Manager est activé, les champs finaux statiques privés ne peuvent pas être modifiés dynamiquement à l'aide de la méthode ci-dessus. En outre, si vous êtes en ligne avec l'optimisation au moment de la compilation, vous ne pouvez pas modifier la valeur à l'aide de la méthode ci-dessus. (Dans ce cas, aucune erreur ne se produira.)
http://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection
Recommended Posts