kotlinkotlin-extensionkotlin-interop

Kotlin extension function access Java private field


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;

}

the Kotlin function would be:

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?


Solution

  • 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
    

    Then, you can read the field value as Int by Field#getInt from the instance of the declaring class, for example:

    val it: ABC = TODO()
    
    val value = field.getInt(it)
    

    Last, your extension method is looks like as below:

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