Kotlin,如何通过反射检索字段值

所以我在几个类中有数百个字段,我想写一些方法在他们自动println每个字段和相应的值

目前我有这个:

 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)) } } } 

但是这是我得到的:

 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) 

任何想法?

您可以使用Kotlin属性和Kotlin反射类来代替使用Java字段和Java反射代码:

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

看来你是通过Field变量作为参数getInt而参数应该是该对象的字段属于this

从Javadoc for Field.getInt(Object obj)

obj – 从中​​提取int值的对象

也许这就是你的意思:

 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() }