In Java ist eine Methode von setAccessible (true) unter Verwendung von Reflection allgemein als Mittel zum Ändern des Werts eines privaten Felds bekannt, auf das normalerweise von außen nicht zugegriffen werden kann.
Wir zeigen Ihnen, wie Sie diese Methode anwenden, um das endgültige Feld dynamisch zu ändern.
Main.java
public class Main {
public static void main(String[] args) throws Exception {
TargetClass clazz = new TargetClass();
System.out.println("Vor dem Update: " + clazz.getTargetField()); // Vor dem Update: 1
Field targetField = clazz.getClass().getDeclaredField("TARGET_FIELD"); //Rufen Sie das Feldobjekt ab, damit der Zugriff aktualisiert werden kann.
Field modifiersField = Field.class.getDeclaredField("modifiers"); //Die Field-Klasse verwendet Modifikatoren, um den Zugriff auf das Feld zu bestimmen, auf das zugegriffen werden soll. Aktualisieren Sie dies.
modifiersField.setAccessible(true); //Da die Modifikatoren selbst privat sind, machen Sie sie zugänglich.
modifiersField.setInt(targetField,
targetField.getModifiers() & ~Modifier.PRIVATE & ~Modifier.FINAL); //Entfernen Sie private und final aus den Modifikatoren des Field-Objekts, um den Zielzugriff zu aktualisieren.
targetField.set(null, 1000); //Wertaktualisierung: 1 -> 1000
System.out.println("_People People People People_"); // _People People People People_
System.out.println("Nach dem Update: > " + clazz.getTargetField() + " <"); // Nach dem Update: > 1000 <
System.out.println("  ̄Y^Y^Y^Y ̄"); //  ̄Y^Y^Y^Y ̄
}
}
TargetClass.java
public class TargetClass {
private static final Integer TARGET_FIELD = 1;
public Integer getTargetField() {
return TARGET_FIELD;
}
}
In einer Umgebung, in der Security Manager aktiviert ist, können private statische Endfelder mit der oben beschriebenen Methode nicht dynamisch geändert werden. Wenn Sie durch die Optimierung zur Kompilierungszeit inline sind, können Sie den Wert mit der obigen Methode nicht ändern. (In diesem Fall tritt kein Fehler auf.)
http://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection
Recommended Posts