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() } 
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • Reflexión de KFlin KFunction - get valores de parameters
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz
  • Kotlin enlazó la incoinheritance de las references invocables
  • ¿Cómo obtengo las funciones declaradas de una class Kotlin (KClass en M12)?
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • instancia :: class.java vs. instance.javaClass
  • ¿Puedo usar kotlin.reflect para get un valor de un campo
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?