Как поменять значение приватного finall поля на другое
В первую очередь нужно знать, что такое действие слишком плохая практика, противоречащая принципу сокрытия информации. Для того чтобы это сделать нужно обратиться к Reflection API.
Для этого нужно:
· чтобы получить дескриптор нужного поля, вызываем метод getDeclaredField() у метакласса Class<X>, относящемуся к нужному нам классу;
· сделать полученный нами экземпляр доступным используя метода setAccessible(true);
· для доступа к методам используются методы get*() и set*(), поскольку Field не привязан к конкретному экземпляру, то экземпляр нужно передать в качестве параметра (если поле статическое передаётся null);
Чтобы убрать модификатор final также используется Reflection API. Модификаторы находятся в поле modifiers, полученного ранее дескриптора field. Также как и при изменении параметра, сначала открываем доступ к модификатору, а потом меняем его. Но данные в modifiers хранятся побитово, то есть как набор битов. Для изменения нужного модификатора final нужно использовать побитовые операторы.
Ниже показано как для объекта myObject изменить значение поля myField на 42.
Field field = myObject.class.getDeclaredField( "myField" );
field.setAccessible( true );
Field modifiersField = Field.class.getDeclaredField( "modifiers" );
modifiersField.setAccessible( true );
modifiersField.setInt( field, field.getModifiers() & ~Modifier.FINAL );
field.setInt(myObject, 42);
Peer-to-peer собеседования
Обучающая платформа AndroidSprint
Практика собеседований с менторами и другими студентами. Реальные вопросы по Kotlin, Android и Backend
- Живые собеседования: практикуйте интервью с менторами и коллегами-студентами
- Реальные вопросы: база вопросов по Kotlin, Android, Backend и QA
- Фидбек: обратная связь после каждого собеседования — знаете, что улучшить