zoukankan      html  css  js  c++  java
  • 使用反射修改final属性

    情型1:static final属性,无法修改其值。

    package m5.d7;  
      
    import java.lang.reflect.Field;  
      
    public class FieldTest {  
        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));  
            } catch (SecurityException e) {  
                e.printStackTrace();  
            } catch (NoSuchFieldException e) {  
                e.printStackTrace();  
            } catch (IllegalArgumentException e) {  
                e.printStackTrace();  
            } catch (IllegalAccessException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
      
    class A {  
        private static final int a = 1;  
    }  
    

    运行

    java.lang.IllegalAccessException: Can not set static final int field m5.d7.A.a to java.lang.Integer  
        at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(Unknown Source)  
        at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(Unknown Source)  
        at sun.reflect.UnsafeQualifiedStaticIntegerFieldAccessorImpl.set(Unknown Source)  
        at java.lang.reflect.Field.set(Unknown Source)  
        at m5.d7.FieldTest.main(FieldTest.java:16)  
    

    情型2:final属性,可以修改其值。

    package m5.d7;  
      
    import java.lang.reflect.Field;  
      
    public class FieldTest {  
        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));  
            } catch (SecurityException e) {  
                e.printStackTrace();  
            } catch (NoSuchFieldException e) {  
                e.printStackTrace();  
            } catch (IllegalArgumentException e) {  
                e.printStackTrace();  
            } catch (IllegalAccessException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
      
    class A {  
        private final int a = 1;  
    }  
    

    运行

    2  
    

      

      

      

  • 相关阅读:
    python---对齐
    python---保留两位小数
    调试--valgrind
    调试--gdb远程调试
    调试---将断点设置在某个文件的某行(多线程调试有用)
    调试-----调试正在运行的多线程程序
    调试---调试正在运行的程序
    linux----dmesg 时间
    c++----static 重复调用
    调试--汇编调试
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6078718.html
Copyright © 2011-2022 走看看