120 votes

Obtenir la valeur du champ/propriété public, static et final d'une classe en Java via la réflexion

Disons que j'ai une classe :

public class R {
    public static final int _1st = 0x334455;
}

Comment puis-je obtenir la valeur du "_1st" via reflection ?

0 votes

R._1er ne fonctionnerait pas? Si vous parlez de développement Android, je pense que la classe R est toujours là...

0 votes

@Matthieu Je pensais aussi, jusqu'à ce jour où j'ai dû faire exactement la même chose, mais seulement avec la classe BR.

148voto

M. Jessup Points 4588

D'abord, récupérez le champ de la classe, puis vous pouvez récupérer la valeur. Si vous connaissez le type, vous pouvez utiliser l'une des méthodes get avec null (pour les champs statiques uniquement, en fait, avec un champ statique, l'argument passé à la méthode get est totalement ignoré). Sinon, vous pouvez utiliser getType et écrire une structure de contrôle appropriée comme ci-dessous :

Field f = R.class.getField("_1st");
Class t = f.getType();
if(t == int.class){
    System.out.println(f.getInt(null));
}else if(t == double.class){
    System.out.println(f.getDouble(null));
}...

0 votes

Merci. J'ai essayé mais cela n'a pas fonctionné. Une exception est lancée à l'opération f.getInt(null). Je l'ai attrapée mais comment se fait-il qu'il y ait une exception?

1 votes

Quel type d'exception avez-vous reçu ?

0 votes

Salut, l'exception e.getMessage() renvoie le nom du champ, qui est "_1st" et rien d'autre.

85voto

Yishai Points 42417
 R.class.getField("_1st").get(null);

La gestion des exceptions est laissée en tant qu'exercice pour le lecteur.

Essentiellement, vous obtenez le champ comme n'importe lequel via la réflexion, mais lorsque vous appelez la méthode get, vous passez un null car il n'y a pas d'instance sur laquelle agir.

Cela fonctionne pour tous les champs statiques, quelle que soit leur finalité. Si le champ n'est pas public, vous devez appeler setAccessible(true) d'abord, et bien sûr le SecurityManager doit autoriser tout cela.

0 votes

Je l'ai eu. La classe dont j'avais besoin était en fait R.id. Merci pour ton aide!

2voto

Vala. D. Points 18

J'étais à la recherche de comment obtenir un champ statique privé et je suis arrivé ici.

Pour les autres chercheurs, voici comment faire:

public class R {
    private static final int _1st = 0x334455;
}

class ReflectionHacking {
    public static main(String[] args) {
        Field field = R.class.getFieldDeclaration("_1st");
        field.setAccessible(true);
        int privateHidenInt = (Integer)field.get(null);
    }
}

1voto

Brian Points 81

Je suivais le même chemin (en regardant à travers la classe R générée) et puis j'ai eu ce sentiment horrible que c'était probablement une fonction dans la classe des Ressources. J'avais raison.

J'ai trouvé ceci : Resources::getIdentifier

Je me suis dit que cela pourrait faire gagner du temps aux gens. Bien qu'ils disent que c'est déconseillé dans la documentation, ce qui n'est pas trop surprenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X