Acceso a la function de extensión de Kotlin Campo privado de Java

Me gustaría acceder al campo privado de Java cuando uso la function de extensión de Kotlin.

Supongamos que tengo una class Java ABC . ABC tiene solo un campo privado mPrivateField . Me gustaría escribir una function de extensión en Kotlin que use ese campo por cualquier razón.

 public class ABC { private int mPrivateField; } 

la function de Kotlin sería:

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

el error que estoy recibiendo es:

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

¿Alguna forma de evitar esa limitación?

En primer lugar, debe get un campo y habilitarlo para que esté accesible en Kotlin, por ejemplo:

 val field = ABC::class.java.getDeclanetworkingField("mPrivateField") field.isAccessible = true 

Luego, puede leer el valor del campo como Int por campo # getInt de la instancia de la class declarante, por ejemplo:

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

Por último, su método de extensión se ve de la siguiente manera:

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

Eso no es posible por layout. Las funciones de extensión esencialmente se resuelven a funciones estáticas con el receptor como su primer parámetro. Por lo tanto, una function de extensión

 fun String.foo() { println(this) } 

comstack a algo como:

 public static void foo(String $receiver) { System.out.println($receiver); } 

Ahora está claro que no puede acceder al miembro privado de $receiver , ya que son, bueno, privados.

Si realmente desea acceder a ese miembro, puede hacerlo utilizando la reflexión, pero perderá todas las garantías.

Así como nhaarman sugirió que use la reflexión para acceder al campo en cuestión. Específicamente, creé un getter que utilizaba la reflexión internamente en la class mencionada (que es ABC )

Tristemente acceder a los campos privados en la function de extensión de Kotlin no es posible a partir de julio de 2017

 fun ABC.testExtFunc() { val canIAccess = this.getmPrivateField() } fun ABC.getmPrivateField() : Int { val field = this.javaClass.declanetworkingFields .toList().filter { it.name == "mPrivateField" }.first() field.isAccessible = true val value = field.get(this) return value as Int } 
  • ¿Por qué tengo que devolver Unit.INSTANCE al implementar en Java una function Kotlin que devuelve una Unidad?
  • ¿Cómo puedo declarar un parámetro de function que puede ser una cadena o una function en Kotlin?
  • Pasar un object detector como un parámetro de function en kotlin
  • Conversión de la implementación Thread / Runnable de Java a Kotlin
  • Clase abstracta Kotlin java IllegalAccessError
  • Choque de statement de plataforma con comparable
  • Java -> Conversión de Kotlin con types crudos
  • Buscador privado y establecedor público para una propiedad de Kotlin
  • 'x' no es una function al pasar parameters en Kotlin Javascript
  • Jinq en Kotlin: ¿cómo convertir lambda en Java Serialized Lambda?
  • Llame al object Kotlin con la delegación de class de Java como método estático