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

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

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

Как я могу получить значение "_ 1st" через отражение?

Ответы [ 3 ]

113 голосов
/ 21 апреля 2010

Сначала получите свойство поля класса, затем вы можете получить значение.Если вы знаете тип, вы можете использовать один из методов 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));
}...
57 голосов
/ 21 апреля 2010
 R.class.getField("_1st").get(null);

Обработка исключений оставлена ​​читателю в качестве упражнения.

По сути, вы получаете поле, как и любое другое, с помощью отражения, но когда вы вызываете метод get, вы передаете нулевое значение, так как не существует экземпляра для действия.

Это работает для всех статических полей, независимо от того, являются ли они окончательными. Если поле не является общедоступным, вам нужно сначала вызвать setAccessible(true), и, конечно, SecurityManager должен разрешить все это.

1 голос
/ 01 декабря 2010

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

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

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

...