Modifier dynamiquement les champs finaux statiques privés en Java

Aperçu

En Java, une méthode de setAccessible (true) utilisant la réflexion est largement connue comme un moyen de modifier la valeur d'un champ privé qui est normalement inaccessible de l'extérieur.

Nous allons vous montrer comment appliquer cette méthode pour changer dynamiquement le champ final.

Exemple de code

Main.java


public class Main {

    public static void main(String[] args) throws Exception {

        TargetClass clazz = new TargetClass();
        System.out.println("Avant la mise à jour: " + clazz.getTargetField());                    // Avant la mise à jour: 1

        Field targetField = clazz.getClass().getDeclaredField("TARGET_FIELD");     //Obtenez l'objet Field pour que l'accès soit mis à jour.
        Field modifiersField = Field.class.getDeclaredField("modifiers");          //La classe Field utilise des modificateurs pour déterminer l'accès au champ auquel accéder, alors mettez-le à jour.
        modifiersField.setAccessible(true);                                        //Puisque les modificateurs eux-mêmes sont privés, rendez-les accessibles.
        modifiersField.setInt(targetField,
                targetField.getModifiers() & ~Modifier.PRIVATE & ~Modifier.FINAL); //Supprimez privé et final des modificateurs de l'objet Field pour accéder à la cible de mise à jour.
        targetField.set(null, 1000);                                               //Mise à jour de la valeur: 1 -> 1000

        System.out.println("_Personnes Personnes Personnes Personnes_");                                  // _Personnes Personnes Personnes Personnes_
        System.out.println("Après la mise à jour: >  " + clazz.getTargetField() + "  <");       // Après la mise à jour: >  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;
    }

}

Supplément

Dans un environnement où Security Manager est activé, les champs finaux statiques privés ne peuvent pas être modifiés dynamiquement à l'aide de la méthode ci-dessus. En outre, si vous êtes en ligne avec l'optimisation au moment de la compilation, vous ne pouvez pas modifier la valeur à l'aide de la méthode ci-dessus. (Dans ce cas, aucune erreur ne se produira.)

référence

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

Recommended Posts

Modifier dynamiquement les champs finaux statiques privés en Java
[Java] Différence entre statique final et final dans les variables membres
Changer le codage Java dans Windows
Différence entre final et immuable en Java
Java statique
Modificateur final et modificateur statique de l'historique d'apprentissage JAVA
Utiliser un bloc d'initialisation statique pour initialiser la liste / l'ensemble de champs statiques en Java
Remplacez List <Optional <T >> par Optional <List <T >> en Java
[Swift vs Java] Comprenons le statique et le final
[Java] Utilisation de final dans la déclaration de variable locale
Comment masquer les champs nuls en réponse en Java
Vérifier le comportement statique et public dans les méthodes Java
Ce qui m'a toujours intéressé dans Java Final
Comment accéder aux méthodes et champs Java Private
Histoire statique Java
Partition en Java
Changements dans Java 11
Janken à Java
Taux circonférentiel à Java
modificateur final java
FizzBuzz en Java
Modifier la taille du tas Java dans Tomcat d'Azure App Service
Inclure l'image dans le fichier jar avec la méthode statique java
Remarque sur l'initialisation des champs dans le didacticiel Java
Modifier la qualité de stockage des images JPEG en Java
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8