Dis que j'ai un cours:
public class R {
public static final int _1st = 0x334455;
}
Comment puis-je obtenir la valeur de "_ 1er" par réflexion?
Commencez par récupérer la propriété field de la classe, puis récupérez la valeur. Si vous connaissez le type, vous pouvez utiliser l'une des méthodes get avec null (pour les champs statiques uniquement, l'argument transmis à la méthode get est en fait totalement ignoré). Sinon, vous pouvez utiliser getType et écrire un commutateur approprié 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));
}...
R.class.getField("_1st").get(null);
La gestion des exceptions reste un exercice pour le lecteur.
Fondamentalement, vous obtenez le champ comme n'importe quel autre via réflexion, mais lorsque vous appelez la méthode get, vous passez une valeur null car il n'y a pas d'instance sur laquelle agir.
Cela fonctionne pour tous les champs statiques, qu'ils soient finaux ou non. Si le champ n'est pas public, vous devez d'abord appeler setAccessible(true)
, et bien entendu le SecurityManager doit autoriser tout cela.
Je suivais le même itinéraire (en parcourant la classe R générée), puis j’ai eu ce sentiment affreux que c’était probablement une fonction de la classe Ressources. J'avais raison.
Trouvé ceci: Resources :: getIdentifier
Je pensais que cela pourrait faire gagner du temps aux gens. Bien qu'ils disent son découragé dans les docs, ce qui n'est pas trop surprenant.