Ändern Sie dynamisch private statische Endfelder in Java

Überblick

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.

Beispielcode

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;
    }

}

Ergänzung

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.)

Referenz

http://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection

Recommended Posts

Ändern Sie dynamisch private statische Endfelder in Java
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
Ändern Sie die Java-Codierung in Windows
Unterschied zwischen final und Immutable in Java
Java statisch
JAVA Learning History Final Modifier und Static Modifier
Verwenden Sie den statischen Initialisierungsblock, um die Liste / den Satz statischer Felder in Java zu initialisieren
Ändern Sie die Liste <Optional <T >> in Java in Optional <Liste <T >>
[Swift vs Java] Lassen Sie uns statisch und endgültig verstehen
[Java] Verwendung von final in der lokalen Variablendeklaration
So verbergen Sie Nullfelder als Antwort in Java
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
Was mich schon immer an Java Final interessiert hat
So greifen Sie auf Java Private-Methoden und -Felder zu
Statische Java-Geschichte
Partisierung in Java
Änderungen in Java 11
Janken in Java
Umfangsrate in Java
Java Final Modifier
FizzBuzz in Java
Ändern Sie die Größe des Java-Heapspeichers in Tomcat von Azure App Service
Fügen Sie das Bild mit der statischen Java-Methode in die JAR-Datei ein
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
Ändern Sie die Speicherqualität von JPEG-Bildern in Java
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten