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'
First of all we will pick a Field from Java class then we will enable that field to make it accessible from Kotlin code.
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).
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;
}
}