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 ?
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 ?
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));
}...
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?
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.
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);
}
}
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 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.
0 votes
R._1er
ne fonctionnerait pas? Si vous parlez de développement Android, je pense que la classeR
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
.