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

Dea*_*ean 3 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);
Run Code Online (Sandbox Code Playgroud)

我很难在 kotlin 中实现同样的目标。问题在于最后一行的按位运算符modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL)。诚然,我一般对按位运算符有些无知,也不知道 kotlin 的等价物。

Dea*_*ean 5

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

在 kotlin 中,AND位运算符是andInt类的中缀函数。类似地,按位求补运算符也是类上的函数invInt

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())
Run Code Online (Sandbox Code Playgroud)