当使用Kotlin extension function 时,我'd like to access Java' s private field .
假设我有一个 Java 类 ABC
. ABC
只有一个私有字段 mPrivateField
. 我想在Kotlin中编写一个扩展函数,无论出于何种原因使用该字段 .
public class ABC {
private int mPrivateField;
}
Kotlin 函数将是:
private fun ABC.testExtFunc() {
val canIAccess = this.mPrivateField;
}
我得到的错误是:
Cannot access 'mPrivateField': It is private in 'ABC'
那种限制的任何方式都是 getting around ?
3 回答
首先,您需要获取Field并在Kotlin中启用它可以是 accessible ,例如:
然后,您可以从声明类的实例中读取
Int
的字段值,例如:最后,您的扩展方法如下所示:
这在设计上是不可能的 . 扩展函数基本上解析为静态函数,接收器作为其第一个参数 . 因此,扩展功能
编译成如下:
现在很清楚地看到你无法访问
$receiver
的私人成员,因为他们是私有的 .如果您真的想要访问该成员,可以使用反射来实现,但您将失去所有保证 .
正如 nhaarman 建议我使用 reflection 来访问相关字段 . 具体来说,我创建了一个在所提到的类内部使用反射的getter(即
ABC
)遗憾的是,截至2017年7月,无法访问Kotlin扩展功能中的私人领域