私はJava Reflectionでプライベートstatic finalフィールドを変更しようとしています。 しかしそれはちょうど失敗します。誰かがアイデアを持っていましたか?ここでJava Reflection、private static 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でのSecurityManagerを削除しようとしました); しかし何も変わっていません。 私はこれが悪いことを知っていますが、私はそれを働かせたいです。 誰かが私を助けてくれることを願っています。
あなたの値は 'Java_FileMerger_Main'ない' SecuredClass' – DNA
ジャワから来ている「の後に」リフレクションは、クラスのバイトコードを変更するためのものではありません。この制限は、セキュリティ上の理由によるものです。たとえば 'setInt(42)'は 'SecuredClass.securedField = 42;'と同じです。 –