Di 'che ho un corso:
public class R {
public static final int _1st = 0x334455;
}
Come posso ottenere il valore di "_1st" tramite riflessione?
BR
classe.
Di 'che ho un corso:
public class R {
public static final int _1st = 0x334455;
}
Come posso ottenere il valore di "_1st" tramite riflessione?
BR
classe.
Risposte:
Recupera prima la proprietà del campo della classe, quindi puoi recuperare il valore. Se conosci il tipo puoi usare uno dei metodi get con null (solo per i campi statici, infatti con un campo statico l'argomento passato al metodo get viene ignorato del tutto). Altrimenti puoi usare getType e scrivere un interruttore appropriato come di seguito:
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()
ignora l'argomento passato? Ho passato ore a cercare di far passare l'istanza della classe.
R.class.getField("_1st").get(null);
La gestione delle eccezioni è lasciata come esercizio per il lettore.
Fondamentalmente ottieni il campo come qualsiasi altro tramite riflessione, ma quando chiami il metodo get passi un valore nullo poiché non c'è alcuna istanza su cui agire.
Funziona per tutti i campi statici, indipendentemente dal fatto che siano definitivi. Se il campo non è pubblico, è necessario setAccessible(true)
prima chiamarlo e, naturalmente, SecurityManager deve consentire tutto ciò.
Stavo seguendo lo stesso percorso (guardando attraverso la classe R generata) e poi ho avuto questa terribile sensazione che probabilmente fosse una funzione nella classe Resources. Avevo ragione.
Trovato questo: Resources :: getIdentifier
Ho pensato che avrebbe potuto far risparmiare tempo alle persone. Anche se dicono che è scoraggiato nei documenti, il che non è troppo sorprendente.
R._1st
non potrebbe funzionare? Se stai parlando di sviluppo Android, penso che laR
classe sia sempre lì ...