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 } 
  • ¿No puede haber una devolución dentro de un Runnable SAM en Kotlin?
  • Llamar a kotlin funciones que son palabras key en java de java?
  • Kotlin, estructura del proyecto
  • Pasar un object detector como un parámetro de function en kotlin
  • Kotlin Vertx Type Mismatch encontrado Future <Unit> expected Handler <AsyncResult <Void >>
  • ¿Cómo implementar esta interfaz Java en Kotlin?
  • Mocking methods de Kotlin con Java + Mockito
  • Kotlin: atribuye visibilidad al object complementario
  • Sintaxis de Kotlin para inferir supertipo genérico de subtipo
  • Referencia no resuelta de Kotlin: println de gradle en la CLI
  • JUnit, @ControllerAdvice y la falta de excepciones marcadas en Kotlin