Java 反射有效的修改 final 屬性值

兩年前寫過一篇 Java 反射修改 final 屬性值, 在這裏從新溫習一下,假設有個類java

class Person {
    public final String name = "Mike";
}code

這裏聲明 name 爲非靜態的屬性只是爲了說明反射修改 final 屬性無關乎靜態不靜態,靜態只是表如今它是一個類屬性,在一個類加載器空間只會有一份拷貝,僅此而已。get

建立一個通用方法進行反射修改屬性值io

public static void modify(Object object, String fieldName, Object newFieldValue) throws Exception {
    Field field = object.getClass().getDeclaredField(fieldName);


    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true); //Field 的 modifiers 是私有的
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);


    if(!field.isAccessible()) {
        field.setAccessible(true);
    }


    field.set(object, newFieldValue);
}


調用 modify(...) 方法試圖修改 person 的 name 屬性 閱讀全文 >>class

相關文章
相關標籤/搜索