编译的时候改动y的值是肯定会编译不过的,用反射的方式绕过编译器,我查了下Method的方法中没有能得到Field类型的方法,因此用类中的final成员来模拟
class Test
{public final String s = "a";
public static void main(String[] args)throws Exception{
Test test = new Test();
Field f = Test.class.getField("s");
String oldv = (String)Test.class.getField("s").get(test);
String newv = oldv.replace('a','b');
f.set(test,newv);
System.out.println(Test.class.getField("s").get(test));
}
结果输出b 分析发现newv并没有改变final中String的指向,也就是说上面这个测试意义不大。
将测试稍加改动 ,改成int
public static void main(String[] args)throws Exception{
Test test = new Test();
Field f = Test.class.getField("s");
f.set(test,3);
System.out.println(Test.class.getField("s").get(test));
无final时,结果正常,加final,编译没问题,运行时期抛出非法访问的异常。
因此可知,在成员变量中,运行时期也不可以改变其值。 |