反射修改私有的final修飾的值,能否修改

結論:可以修改。

package shiro;

public class Test {
    private final String NAME = "天氣晴朗";


    public String getName(){
        
        return NAME;
    }
}
package shiro;

import java.lang.reflect.Field;

public class Client {
    public static void main(String[] args) throws NoSuchFieldException {
        Test test = new Test();
        Class mClass = test.getClass();
        Field field = mClass.getDeclaredField("NAME");
        if(field != null){
            //setAccessible(true);得作用就是讓我們在用反射時訪問私有變量
            field.setAccessible(true);
            try {
                System.out.println("modify before "+field.get(test));
                field.set(test,"鋼絲");
                System.out.println("modify after "+field.get(test));
                System.out.println("getName = "+test.getName());
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}

但如果是要修改上面getName方法的返回值,則要看Test編譯成的class文件是什麼樣子的。

參考:https://www.jianshu.com/p/50830768bd52

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章