Скажите, что у меня есть класс:
public class R {
public static final int _1st = 0x334455;
}
Как я могу получить значение "_1st" через отражение?
Сначала получите свойство поля класса, затем вы можете получить значение. Если вам известен тип, вы можете использовать один из методов get со значением null (только для статических полей, фактически со статическим полем аргумент, переданный методу get, полностью игнорируется). В противном случае вы можете использовать getType и написать соответствующий переключатель, как показано ниже:
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);
Обработка исключений оставлена в качестве упражнения для читателя.
В основном вы получаете поле, как и любое другое, через отражение, но когда вы вызываете метод get, вы передаете значение null, поскольку нет экземпляра, с которым можно было бы действовать.
Это работает для всех статических полей, независимо от того, являются ли они окончательными. Если поле не является общедоступным, вам нужно сначала вызвать для него setAccessible (true)
, и, конечно же, SecurityManager должен разрешить все это.