How to access Java private field in Kotlin extension function

Fetching Comments ...

How to access Java private field in Kotlin extension function

If 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'

So here is fix to resolve this problem

First of all we will pick a Field from Java class then we will enable that field to make it accessible from Kotlin code.

Example:

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

field.isAccessible = true

Now we can read field value as Int using Field#getInt function from instance of our ABC class (declaring class).

Example:

val it: ABC = TODO()

val value = field.getInt(it)

Now our extension method in Kotlin will look like this:

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

LearnPainLess On Instagram

Get The Best Of All Hands Delivered To Your Inbox

Subscribe to our newsletter and stay updated.