Ändern privater Endfelder durch Reflektion

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

Ausgabe:

s = Im totally safe
f.get(pf): Im totally safe
s = Im totally safe
No, youre not!

Warum funktioniert es auf diese Weise, können Sie bitte erklären? Die erste print-sagt uns, dass die privaten "s" - Feld nicht geändert wurde, als ich erwarte. Wenn wir aber das Feld per reflection, die zweite Auflage zeigt, ist es aktualisiert.

InformationsquelleAutor der Frage Alexandr | 2010-12-23

Schreibe einen Kommentar