class WithPrivateFinalField {
private final String s = "I'm totally safe";
public String toString() {
return "s = " + s;
}
}
WithPrivateFinalField pf = new WithPrivateFinalField();
System.out.println(pf);
Field f = pf.getClass().getDeclaredField("s");
f.setAccessible(true);
System.out.println("f.get(pf): " + f.get(pf));
f.set(pf, "No, you're not!");
System.out.println(pf);
System.out.println(f.get(pf));
Sortie:
s = I'm totally safe
f.get(pf): I'm totally safe
s = I'm totally safe
No, you're not!
Pourquoi cela fonctionne-t-il de cette façon, pouvez-vous expliquer, s'il vous plaît? La première impression nous indique que le champ "s" privé n’a pas été modifié, comme je l’attendais. Mais si nous obtenons le champ par réflexion, le deuxième tirage indique qu'il est mis à jour.