我知道在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 的等价物。
发布问题后我立即找到了解决方案。正在使用的按位运算符及其 Java 表示形式是AND ( $) 和按位补码( ~)。
在 kotlin 中,AND位运算符是andInt类的中缀函数。类似地,按位求补运算符也是类上的函数inv。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())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |