Получение значения публичного статического конечного поля / свойства класса в Java через отражение


скажем у меня есть класс:

public class R {
    public static final int _1st = 0x334455;
}

Как я могу получить значение поля/свойства "_1st" через отражение?

3 76

3 ответа:

сначала извлеките свойство field класса, затем вы можете получить значение. Если вы знаете тип, вы можете использовать один из методов 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 должен разрешить все это.

я следовал по тому же маршруту (просматривая сгенерированный класс R), а затем у меня было это ужасное чувство, что это, вероятно, функция в классе ресурсов. Я был прав.

нашел это: ресурсы::getIdentifier

думал, что это может сэкономить людям некоторое время. Хотя они говорят, что его обескуражили в документах, что не слишком удивительно.