Cambio de campos finales privados a través de la reflexión

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

Salida:

s = I’m totally safe
f.get(pf): I’m totally safe
s = I’m totally safe
No, you’re not!

¿Por qué funciona de esta manera? ¿Puedes explicarlo? La primera impresión nos dice que el campo privado "s" no ha cambiado, como espero. Pero si obtenemos el campo mediante reflexión, la segunda impresión muestra que se actualiza.