Получение значения открытого статического конечного поля / свойства класса в Java с помощью отражения

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

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

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

4 ответа

Решение

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

Я искал, как получить частное статическое поле и приземлился здесь.

Для коллег по поиску, вот как:

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

class ReflectionHacking {
    public static main(String[] args) {
        Field field = R.class.getFieldDeclaration("_1st");
        field.setAccessible(true);
        int privateHidenInt = (Integer)field.get(null);
    }
}

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

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

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

Другие вопросы по тегам