kotlin反射获取字段的列表

有没有一个等效的java反射foo.getClass().getFields() in Kotlin? 我只能发现,当我知道它的名字时,我可以访问一个字段,但是我想以通用的方式处理字段。

你是否希望字段像“属性”中的“后台字段”或字段一样… Kotlin真的只有属性。 您可以使用以下方式获取这些课程:

 MyTest::class.memberProperties // or MyTest::class.declaredMemberProperties 

从Java Class<T> ,使用kotlin扩展属性获取可以继续执行的Kotlin KClass<T>

 someClassOfMine.javaClass.kotlin.memberProperties 

这需要kotlin-reflect依赖关系以及添加到你的构建和类路径。 你会在KClass上找到许多其他有用的东西

对于属性背后的秘密支持字段,使用Java反射需要您自担风险。

你不能在Kotlin中这样做,但是在java中这样做有一个不可靠的方法。 你可以使用java反射。 喜欢这个:

 public class TestClass { trait EmptyTrait class EmptyClass public var anotherVar:Int? = null public val contant:Float = 10f private var emptyTrait:EmptyTrait? = null val emptyClass:EmptyClass = EmptyClass() public fun setVal(fieldName: String, value: Int) { javaClass.getDeclaredField(fieldName).set(this, value); } public fun getFieldNames(): String { return javaClass.getDeclaredFields().map{it.getName()}.join(", ") } } 

我们来测试一下:

 val t = TestClass() Log.v("MainActivity", "Fields: " + t.getFieldNames()) Log.v("MainActivity", "anotherVar: " + t.anotherVar) t.setVal("anotherVar", 10) Log.v("MainActivity", "anotherVar: " + t.anotherVar) 

结果:

 Fields: anotherVar, emptyClass, emptyTrait, contant, $kotlinClass anotherVar: null anotherVar: 10 

有用 )

现在非常容易使用Kotlin v1.1,您可以使用以下方法获取kotlin中的字段

 val fields = MyClass.javaClass.kotlin.members 

哪里MyClass是您选择的类。

为了使用这个,你需要把kotlin-reflect包含在你的gradle构建文件中,如下所示

 compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" 

此外,如果您需要java字段,也可以直接从javaClass中获取字段(在某些情况下可用,因为这些字段覆盖的范围略有不同)

 val fields = MyClass.javaClass.declaredFields