通过反射更改后访问最终变量值的问题

时间:2016-06-03 07:13:16

标签: java reflection

 class FinalConcept
 {
   private final int number = 22;


   public static void main(String args[])
    { 
          try{
        FinalConcept obj  = new FinalConcept();      
        System.out.println("value of the x variable "+obj.number);


       Field obj1 = obj.getClass().getDeclaredField("number");
        obj1.setAccessible(true);
         obj1.setInt(obj,45); 

如果我尝试通过字段函数访问变量,那么我会更改值

System.out.println("value of the x variable "+obj1.get(obj));//45

但如果我尝试通过变量名访问,我会得到相同的值

System.out.println("value of x varialbe "+obj.x);//22

为什么要这样做?

2 个答案:

答案 0 :(得分:0)

您的数字变量被声明为final,因此无法修改。对象本身将始终保持相同的值。

答案 1 :(得分:0)

有趣的是,我试图挖掘它,发现一个观察结果,如果我们更改了字段"数字"从 int Integer ,然后我们得到例外:

Exception-> java.lang.IllegalArgumentException: Can not set final java.lang.Integer field HelloTestJava.number to (int)45

我观察到的一个原因是,这种行为只与原语(int,char,byte,short,boolean,float,double,long)有关。没有例外如果我们尝试通过Field对象更改最终基元字段的值。

当我采用最终的布尔字段并尝试通过反射(即通过Field对象)更改它时,我得到了同样的例外

Exception->  java.lang.IllegalArgumentException: Can not set final java.lang.Boolean field HelloTestJava.number to (boolean)false

但有一件事是肯定的,你的对象总会有正确的(未改变的)值,我们试图通过反射来修改这个值并不重要。