Kotlin, cómo recuperar el valor del campo a través de la reflexión

Así que tengo cientos de campos en un par de classs y me gustaría escribirles algunos methods donde println automáticamente cada campo y su valor correspondiente

Por el momento tengo esto:

 inner class Version(val profile: Profile) { @JvmField val MINOR_VERSION = glGetInteger(GL_MINOR_VERSION) fun write(file: File? = null) { //file.printWriter().use { out -> out.pri } this::class.java.fields.forEach { println(it.isAccessible) println(it.getInt(it)) } } } 

Pero esto es lo que obtengo:

 false Exception in thread "main" java.lang.IllegalArgumentException: Can not set final int field uno.caps.Caps$Version.MINOR_VERSION to java.lang.reflect.Field at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) at sun.reflect.UnsafeQualifiedIntegerFieldAccessorImpl.getInt(UnsafeQualifiedIntegerFieldAccessorImpl.java:58) 

¿Alguna idea?

En lugar de usar campos Java y código de reflection de Java, también puede usar las properties de Kotlin y las classs de reflection de Kotlin:

 class Reflector { val Foo = 1; fun printFields() { this::class.memberProperties.forEach { if (it.visibility == KVisibility.PUBLIC) { println(it.name) println(it.getter.call(this)) } } } } 

Parece que está pasando la variable Field como un parámetro getInt mientras que el parámetro debería ser el object al que pertenece el campo:

Del Javadoc para Field.getInt(Object obj) :

obj – el object para extraer el valor int de

Quizás esto es lo que quisiste hacer:

 class Reflector { @JvmField val Foo = 1; fun printFields() { this.javaClass.fields.forEach { println(it.isAccessible) println(it.getInt(this)) } } } fun main(args : Array<String>) { Reflector().printFields() } 
  • ¿Cómo puedo get una reference a un object Kotlin por su nombre?
  • java.lang.IllegalArgumentException: Callable espera 4 arguments, pero se proporcionaron 3
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • Implementando una interfaz de kotlin en java
  • ¿Puedo get una KFunction de una variable del tipo de function en Kotlin?
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • ¿Cómo uso el object Kotlin por reflexión?
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • ¿Cómo get una class de time de ejecución de una variable en Kotlin?
  • ¿Cómo puedo get una reference a Kotlin KClass por nombre cuando no se ejecuta en la JVM?