我試圖改變一個私有靜態final字段與Java反射。 但它只是失敗。有人有想法嗎?Java反射,改變私有靜態final字段沒有做任何事
這裏是我的代碼:
public class SecuredClass {
private static final String securedField = "SecretData";
public static String getSecretData() { return securedField; }
}
public class ChangeField {
static void setFinalStatic(Field field, Object newValue) throws Exception
{
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~ Modifier.FINAL);
field.set(null, newValue);
}
public static void main(String args[]) throws Exception
{
System.out.println("Before = " + SecuredClass.getSecretData());
Field stringField = SecuredClass.class.getDeclaredField("securedField");
stringField.setAccessible(true);
setFinalStatic(stringField, "Screwed Data!");
System.out.println("After = " + Java_FileMerger_Main.getSecretData());
}
}
這是我的輸出:
Before = SecretData
After = SecretData
我試圖刪除與System.setSecurityManager的安全管理器(空); 但它沒有改變任何東西。 我知道這是邪惡的,但我想讓它工作。 我希望有人能幫助我。
你「後」的價值來自於'Java_FileMerger_Main'不'SecuredClass' – DNA 2012-02-22 08:35:09
的Java反射不是用來改變類的字節碼的。這個限制也是出於安全原因。例如'setInt(42)'將與'SecuredClass.securedField = 42;'相同。 – 2012-02-22 08:38:48