Reflection 在kotlin中使用反射更改访问修改器

Reflection 在kotlin中使用反射更改访问修改器,reflection,kotlin,Reflection,Kotlin,我知道在java中,如果我希望使用反射设置最终字段,我可以更改字段的访问修饰符,如下所示: Field field = clazz.getDeclaredField("someField"); field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(f

我知道在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)
上的位运算符。诚然,我对一般的位运算符有些无知,也不知道kotlin的等价物

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

在kotlin中,按位运算符是
Int
类的中缀函数。类似地,按位互补运算符也是
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())