I'd like to access Java's private field when using Kotlin extension function.

Suppose I have a Java class ABC. ABC has only one private field mPrivateField. I'd like to write an extension function in Kotlin which uses that field for whatever reason.

public class ABC {
    private int mPrivateField;

}

Kotlin功能将是:

private fun ABC.testExtFunc() {
    val canIAccess = this.mPrivateField;
}

the error I'm getting is:

Cannot access 'mPrivateField': It is private in 'ABC'

Any way of getting around that limitation?

推荐答案

First, you need to obtain a Field and enable it can be accessible in Kotlin, for example:

val field = ABC::class.java.getDeclaredField("mPrivateField")

field.isAccessible = true

然后,可以从声明类的实例中读取字段值Int x Field#getInt,例如:

val it: ABC = TODO()

val value = field.getInt(it)

最后,您的扩展方法如下所示:

private inline fun ABC.testExtFunc():Int {
    return javaClass.getDeclaredField("mPrivateField").let {
        it.isAccessible = true
        val value = it.getInt(this)
        //todo
        return@let value;
    }
}

Kotlin相关问答推荐

判断字符串是否除了.&" ",","@""""

Kotlin中的增广赋值语句中的难以理解的错误

多模块Kotlin项目中的FreeFair

如何在操作系统版本上正确获取Room数据库的路径>;=26 sdk?

kotlin 模式匹配如何像 scala 一样工作

为什么 Kotlin 在 sumOf 函数 lambda 中默认不将数字视为Int?

为 Gradle 子项目配置 Kotlin 扩展

添加 Kapt 插件后 - 执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

如何使用 Findbugs 避免 kotlin 文件

Fragment的onDestroy()中是否需要将ViewBinding设置为null?

Kotlin 解构超过五个组件

为什么我在使用 Jetpack Compose clickable-Modifier 时收到后端内部错误:Exception during IR lowering error?

从代码块执行和返回(在 Elvis 运算符之后)

将多个 Kotlin 流合并到一个列表中,而无需等待第一个值

Kotlin通过映射委托属性,如果映射中不存在,则抛出NoTouchElementException

从片段(fragment)中的点击事件启动协同程序

android Room 将 Null 作为非 Null 类型返回

uses-sdk:minSdkVersion 16 不能小于库中声明的版本 23

在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件

Kotlin:访问 when 语句的参数