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