兩年前寫過一篇 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