Kotlin反射 - 获取类的所有字段名称

Iva*_*ers 9 java reflection kotlin

我怎样才能获得Kotlin数据类的列表declaredFields呢?像Java一样getDeclaredFields()

如果这是可能的,还可以过滤publicprivate字段?(像Java一样Modifier.isPrivate(field.getModifiers()))

hot*_*key 12

可能你想要的是获取类的属性,而不是字段.这可以按如下方式完成:

MyClass::class.declaredMemberProperties
Run Code Online (Sandbox Code Playgroud)

通过Java反射也可以获得字段:

MyClass::class.java.declaredFields
Run Code Online (Sandbox Code Playgroud)

但是字段在Kotlin中是一个实现细节,因为某些属性可能没有支持字段.


至于可见性,对于属性,您可以检查getter可见性修饰符:

val p = MyClass::class.declaredMemberProperties.first()
val modifiers = p.javaGetter?.modifiers
Run Code Online (Sandbox Code Playgroud)

注意:这是null在简单private val@JvmField使用的情况下.然后你可以检查p.javaField.

然后,如果modifiers不是null,只需检查它Modifier.isPrivate(...).

Kotlin中的属性可以为getter和setter提供单独的可见性修饰符,但是setter访问不能比getter更宽松,这实际上是属性可见性.