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  
    

      

      

      

  • 相关阅读:
    POJ3678 KATU PUZZLE
    poj3321(codevs1228)苹果树
    codevs 1955 光纤通信 USACO
    codevs 1027 姓名与ID
    codevs 1051 接龙游戏
    洛谷 P1717 钓鱼
    codevs 1062 路由选择
    洛谷 P1083 借教室
    codevs 2596 售货员的难题
    Vijos 1053 easy sssp
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6078718.html
Copyright © 2011-2022 走看看