2012-06-25 4 views
16

Change private static final field using Java reflectionAndroid: изменение частного статического окончательного поля с помощью Java Reflection

Я следовал инструкциям в приведенной выше ссылке, чтобы изменить личное статическое последнее поле с помощью Java Reflection. У меня есть объект с именем «data». Внутри «данных» есть частная статическая конечная переменная с именем «type». Я хочу установить «тип» равным нулю. Вот мой код.

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: модификаторы

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

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

+0

Вы ... не можете изменить _modifiers в поле класса_ в _runtime._ –

+1

Я могу по этой ссылке. – jas7

+2

Помните, что компилятор Java может встроить значения примитивных статических конечных полей. Выполнение такого рода магии отражения может привести к причудливому поведению. – millimoose

ответ

10

Это работает.

Field field = data.getClass().getDeclaredField("type"); 
field.setAccessible(true); 
field.set(data, null); 
+1

Это сработало. Но почему? Устраняет ли АРТ окончательный модификатор или просто позволяет получить к нему доступ? –

+0

Это работает, потому что первый объект в функции 'field.set (...)' является объектом для изменения NOT. Поле – prom85

+0

данных не является статическим в этом случае? –

Смежные вопросы