Java 有着强大的反射机制,但是也是因为反射的存在,导致 Java 写的代码并不是绝对安全的,就比如一个变量声明为 final,却不能保证它在运行中绝对不会被修改。
比如下面的代码:
public class Test {
private static final Date time = new Date();
}
正常情况下运行中是不能修改这个 time
变量的,但是用反射呢?
import java.lang.reflect.Field;
import java.util.Date;
public class Test {
private static final Date time = new Date();
public static void main(String[] args) throws Exception {
System.out.println(time);
Field field = Test.class.getDeclaredField("time");
field.setAccessible(true);
field.set(null, new Date(0));
System.out.println(time);
}
}
很不幸,报错了,提示我们