使用Kotlin中的反射更改访问修饰符

时间:2018-12-13 11:05:12

标签: reflection kotlin

我知道在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);

我在Kotlin很难实现相同的目标。问题在于最后一行modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL)上的按位运算符。诚然,我一般都不了解按位运算符,也不了解kotlin等效项。

1 个答案:

答案 0 :(得分:0)

发布问题后,我立即找到了解决方案。正在使用的按位运算符及其Java表示形式为 AND $)和按位补语~)。

在kotlin中, AND 按位运算符是Intand的中缀函数。同样,按位补语运算符也是Int类上的函数inv

在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())