我知道在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等效项。
答案 0 :(得分:0)
发布问题后,我立即找到了解决方案。正在使用的按位运算符及其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())