Digamos que eu tenha uma aula:
public class R {
public static final int _1st = 0x334455;
}
Como posso obter o valor de "_1st" via reflexão?
BR
classe.
Digamos que eu tenha uma aula:
public class R {
public static final int _1st = 0x334455;
}
Como posso obter o valor de "_1st" via reflexão?
BR
classe.
Respostas:
Primeiro, recupere a propriedade do campo da classe, então você pode recuperar o valor. Se você souber o tipo, poderá usar um dos métodos get com null (apenas para campos estáticos; na verdade, com um campo estático o argumento passado para o método get é totalmente ignorado). Caso contrário, você pode usar getType e escrever uma opção apropriada conforme abaixo:
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 o argumento passado? Passei horas tentando fazer com que a instância da classe passasse ali.
R.class.getField("_1st").get(null);
O tratamento de exceções é deixado como um exercício para o leitor.
Basicamente, você obtém o campo como qualquer outro por meio de reflexão, mas ao chamar o método get, você passa um nulo, pois não há instância para agir.
Isso funciona para todos os campos estáticos, independentemente de serem finais. Se o campo não for público, você precisa chamá setAccessible(true)
-lo primeiro e, claro, o SecurityManager deve permitir tudo isso.
Eu estava seguindo a mesma rota (olhando através da classe R gerada) e então tive a terrível sensação de que provavelmente era uma função da classe Recursos. Eu tinha razão.
Encontrou isto: Resources :: getIdentifier
Achei que isso pudesse economizar algum tempo. Embora digam que é desencorajado nos documentos, o que não é muito surpreendente.
R._1st
não funcionou? Se você está falando sobre desenvolvimento Android, acho que aR
aula está sempre lá ...