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

3
我知道在Java中,如果我想使用反射来设置一个final字段,我可以改变字段的访问修饰符,如下所示:
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个回答

5

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

Kotlin中AND按位运算符是Int类的中缀函数and。同样,按位补码运算符也是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())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接