Вопрос по android, reflection, java – Android: изменение частного статического финального поля с использованием java отражения

17

Изменить частное статическое конечное поле с помощью отражения Java

Я следовал инструкциям, приведенным в ссылке выше, чтобы изменить частное статическое конечное поле, используя отражение Java. У меня есть объект с именем & quot; данные. & Quot; Внутри & quot; данные & quot; есть частная статическая конечная переменная с именем & quot; тип. & quot; Я хочу установить & quot; тип & quot; быть нулевым. Вот мой код

Field field = data.getClass().getDeclaredField("type");
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(data, null);

Я попытался сделать это на Java 1.7 с похожим кодом, и это сработало. Но запуск этого кода на Android приводит к следующей ошибке: java.lang.NoSuchFieldException: modifiers

Я думаю, "модификаторы" не является полем в классе Field в Android.

Как это исправить?

Я могу по этой ссылке. jas7
Помните, что компилятор Java может встроить значения примитивных статических полей final. Использование такого рода магии отражения может привести к странному поведению. millimoose
Вы ... не можете изменитьmodifiers on a class field вruntime. Louis Wasserman

Ваш Ответ

1   ответ
10

Field field = data.getClass().getDeclaredField("type");
field.setAccessible(true);
field.set(data, null);
данные не статичны в этом случае?
Это сработало. Но почему? Удаляет ли ART окончательный модификатор или он все равно позволяет получить к нему доступ?
Это работает, потому что первый объект вfield.set(...) функция - это объект, который нужно изменить, а НЕ поле

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