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