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