Изменение модификатора доступа с использованием отражения в котлине - PullRequest
0 голосов
/ 13 декабря 2018

Я знаю в Java, если я хочу использовать отражение, чтобы установить последнее поле, я могу изменить модификатор доступа к полю следующим образом:

Field field = clazz.getDeclaredField("someField");
field.setAccessible(true);

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

Мне трудно достичь того же в котлине.Проблема с побитовыми операторами в последней строке modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL).По общему признанию я немного не знаю о побитовых операторах вообще и не знаю эквивалентов Котлина.

1 Ответ

0 голосов
/ 13 декабря 2018

Сразу после публикации вопроса я нашел решение.Используемые побитовые операторы и их java-представления: AND ($) и побитовый комплимент (~).

В kotlin побитовый оператор AND является инфиксной функцией Int класса и .Точно так же оператор побитового комплимента также является функцией inv в классе Int.

Способ изменения модификатора в kotlin:

val field = clazz.getDeclaredField("someField")
field.isAccessible = true

val modifers = field.javaClass.getDeclaredField("modifiers")
modifers.isAccessible = true
modifers.setInt(field, field.modifiers and Modifier.FINAL.inv())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...