java反射修改final属性的两种不同结果是何原因
2014-06-24 来自:小清新.jar 0 人回应

这段代码中

public class MainTest {


public static void main(String[] args) {

try {  
            A a = new A();  

            Field field = a.getClass().getDeclaredField("a");  

            field.setAccessible(true);  

            field.set(a, 2);  

            System.out.println(field.get(a));  //打印  2
            System.out.println(a.getA()); //打印  1 为什么这里不是2
        } catch (SecurityException e) {  
            e.printStackTrace();  
        }        }
}


class A {  
    private final int a=1 ;  



    public int getA()
    {
    return this.a;
    }
}

如果把A修改为

class A {  
    private final int a ;  //区别在于这里没给a直接赋值,而是用构造函数

    public A()
    {
        this.a=1;
    }

    public int getA()
    {
        return this.a;
    }
}

这时如下

System.out.println(field.get(a)); //打印 2
System.out.println(a.getA()); //打印 2 为什么这次是2了

我想知道这个原因是为什么。如果这样,是不是申明时就赋了值的final属性是没法用反射修改的?(或者说这样的final属性才是安全的)

还没有人回应!

您的回应

你还未登陆,不能回应!登陆