Java 通过反射更改最终变量后,访问其值时出现的问题

Java 通过反射更改最终变量后,访问其值时出现的问题,java,reflection,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 var

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

 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

为什么会出现这种情况?

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

很有趣,我试着把它挖出来,发现了一个观察结果,如果我们将字段“number”从int改为整数,那么我们会得到一个异常:

异常->
java.lang.IllegalArgumentException:无法将最终java.lang.Integer字段HelloTestJava.number设置为(int)45

我观察到的一个原因是,这种行为仅适用于原语(int、char、byte、short、boolean、float、double、long)。如果我们试图通过field对象更改最终原语字段的值,也不例外

当我获取最后一个布尔字段并试图通过反射(即通过字段对象)来更改它时,遇到了相同的异常


但是有一点是肯定的,您的对象将始终具有正确(未更改)的值,这与我们试图通过反射修改值无关。

可能的解决方案:我怀疑
x
只是成为编译时常量并直接内联。但说真的,你为什么要这样处理最终变量?
System.out.println("value of x varialbe "+obj.x);//22
Exception->  java.lang.IllegalArgumentException: Can not set final java.lang.Boolean field HelloTestJava.number to (boolean)false