Получить статическую переменную из динамического класса [duplicate]

Вы понимаете концепцию кастинга? Кастинг - это процесс преобразования типов, который в Java очень распространен, потому что это статически типизированный язык. Некоторые примеры:

Вставить строку «1» в int -> no problem

Вставить строку «abc» в int -> вызывает ClassCastException

Или подумайте о диаграмме классов с Animal.class, Dog.class и Cat.class

Animal a = new Dog();
Dog d = (Dog) a; // No problem, the type animal can be casted to a dog, because its a dog.
Cat c = (Dog) a; // Raises class cast exception; you can't cast a dog to a cat.
74
задан Matthew Read 16 December 2016 в 23:59
поделиться

3 ответа

Сначала найдите свойство поля класса, затем вы можете получить значение. Если вы знаете тип, вы можете использовать один из методов get с нулевым значением (только для статических полей, фактически со статическим полем аргумент, переданный методу 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));
}...
99
ответ дан M. Jessup 19 August 2018 в 05:15
поделиться
  • 1
    Благодарю. Я попытался, но это не сработало. Исключение выбрано при операции f.getInt (null). Я поймал его, но как получилось исключение? – Viet 21 April 2010 в 19:26
  • 2
    Какое исключение вы получили? – M. Jessup 21 April 2010 в 19:35
  • 3
    Привет, Exception e.getMessage () возвращает имя поля, которое является «_1st». и ничего больше. – Viet 21 April 2010 в 19:41
  • 4
    Но каков тип исключения? (то есть NullPointerException, SecurityException, ...) – M. Jessup 21 April 2010 в 20:16
  • 5
    Почему документация никогда не упоминает, что getInt() игнорирует переданный в аргументе? Проводили часы, пытаясь получить туда экземпляр класса. – Sevastyan 8 November 2017 в 17:11

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

Найдено: Ресурсы :: getIdentifier

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

1
ответ дан Brian 19 August 2018 в 05:15
поделиться
  • 1
    Идеально подходит для чтения ресурсов от других апк – schwiz 9 July 2014 в 20:30
  • 2
    Итак, вы поняли, что это вопрос Android. Должно быть указано в тегах ... – Matthieu 23 April 2015 в 15:03
  • 3
    Это не вопрос Android, это вопрос Java-размышления, в котором используется конкретный пример. Вопросы отмечены по их теме. – Matthew Read 19 December 2016 в 18:05
 R.class.getField("_1st").get(null);

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

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

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

47
ответ дан ROMANIA_engineer 19 August 2018 в 05:15
поделиться
  • 1
    спасибо, но это не помогло ... – Viet 21 April 2010 в 19:25
  • 2
    @Viet, можете ли вы пояснить, что с этим не сработало? Возможно, опубликовать код, который у вас есть, который не работает? – Yishai 21 April 2010 в 19:37
  • 3
    Привет, Exception e.getMessage () возвращает имя поля, которое является «_1st». и ничего больше. – Viet 21 April 2010 в 19:41
  • 4
    Привет, Viet, как насчет трассировки стека, и каков тип исключения? – Yishai 21 April 2010 в 20:00
  • 5
    Я понял. Класс, в котором я нуждался, был фактически R.id. Спасибо за вашу помощь! – Viet 21 April 2010 в 20:16
Другие вопросы по тегам:

Похожие вопросы: