不変性を段階的に示すためにクラスを設計したいと思います。続き最終変数をリフレクションから保護する
は今、私はまだ、次のコードを使用することにより、リフレクションを使用して突破することができます単純なクラス
public class ImmutableWithoutMutator {
private final String firstName;
private final String lastName;
private final int age;
public ImmutableWithoutMutator(final String firstName, final String lastName, final int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
@Override
public String toString() {
return String.format(
"ImmutableWithoutMutator [age=%s, firstName=%s, lastName=%s]",
age, firstName, lastName);
}
}
です。
import java.lang.reflect.Field;
public class BreakImmutableUsingReflection {
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
ImmutableWithoutMutator immMutator = new ImmutableWithoutMutator(
"firstName", "lastName", 2400);
System.out.println(immMutator);
// now lets try changing value using reflection
Field f = ImmutableWithoutMutator.class.getDeclaredField("age");
f.setAccessible(true);
f.set(immMutator, 2000);
System.out.println(immMutator);
}
}
私の質問は、リフレクションAPIを使用してフィールドの修飾語を変更していないことです。それでは、コードが最終的なフィールドをどのように変えることができるのでしょうか?
可能な複製http://stackoverflow.com/questions/1615163/modifying-final-fields-in-java?rq=1 – Patashu