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 } 
  • Pasar un object detector como un parámetro de function en kotlin
  • Java -> Conversión de Kotlin con types crudos
  • Kotlin: No se puede usar GenericTypeIndicator para llamar al getValue de Firebase Database
  • Clase abstracta Kotlin java IllegalAccessError
  • ¿Es posible acceder a las tipografías de Kotlin desde Java?
  • Ejecutando el código de kotlin dentro de un proyecto de Java
  • Jinq en Kotlin: ¿cómo convertir lambda en Java Serialized Lambda?
  • ¿Cómo puedo declarar un parámetro de function que puede ser una cadena o una function en Kotlin?
  • La inferencia del tipo Java lambda no funciona como se esperaba en Kotlin
  • Kotlin utiliza la interfaz de callback de Java
  • ¿No puede haber una devolución dentro de un Runnable SAM en Kotlin?