Tôi muốn thiết kế một lớp học để chứng minh tính bất biến, từng bước.Bảo vệ các biến số cuối cùng khỏi sự phản ánh
Sau đây là một lớp đơn giản
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);
}
}
Bây giờ tôi vẫn có thể vi phạm trong việc sử dụng phản chiếu, bằng cách sử dụng đoạn mã sau.
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);
}
}
Câu hỏi của tôi là, tôi chưa sửa đổi Modifiers cho các trường sử dụng API phản chiếu. Sau đó, làm thế nào mã vẫn có thể đột biến các lĩnh vực cuối cùng?
Bản sao có thể có của http://stackoverflow.com/questions/1615163/modifying-final-fields-in-java?rq=1 – Patashu