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  
    

      

      

      

  • 相关阅读:
    成年人的快乐
    90后家庭的宠物
    计算机科学与技术易错知识点需记篇
    微机原理与接口编程技术2020 考试大纲知识点超细总结
    84.手写一个类的继承
    83.对前端路由的理解?前后端路由的区别
    81.$(document).ready()方法和window.onload有什么区别?
    80.浏览器是如何渲染页面的
    77、常用的拖拽事件
    75.json和jsonp的区别?
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6078718.html
Copyright © 2011-2022 走看看