Dis que j'ai un cours:
public class R {
public static final int _1st = 0x334455;
}
Comment puis-je obtenir la valeur du "_1st" par réflexion?
BR
classe.
Dis que j'ai un cours:
public class R {
public static final int _1st = 0x334455;
}
Comment puis-je obtenir la valeur du "_1st" par réflexion?
BR
classe.
Réponses:
Récupérez d'abord la propriété field 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 entièrement 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));
}...
getInt()
ignore l'argument passé? J'ai passé des heures à essayer de faire passer l'instance de la classe.
R.class.getField("_1st").get(null);
La gestion des exceptions est un exercice pour le lecteur.
Fondamentalement, vous obtenez le champ comme n'importe quel autre via la réflexion, mais lorsque vous appelez la méthode get, vous passez un null car il n'y a aucune instance sur laquelle agir.
Cela fonctionne pour tous les champs statiques, qu'ils soient définitifs. Si le champ n'est pas public, vous devez d'abord l'appeler setAccessible(true)
, et bien sûr le SecurityManager doit autoriser tout cela.
Je suivais le même chemin (en regardant à travers la classe R générée) et ensuite j'ai eu ce sentiment terrible que c'était probablement une fonction dans la classe Resources. J'avais raison.
Trouvé ceci: Resources :: getIdentifier
Je pensais que cela pourrait faire gagner du temps aux gens. Bien qu'ils disent que c'est découragé dans la documentation, ce qui n'est pas trop surprenant.
R._1st
ne pouvait pas fonctionner? Si vous parlez de développement Android, je pense que laR
classe est toujours là ...