如何获取 Kotlin 数据类的 declaredFields
列表?类似于 Java 的 getDeclaredFields()
。
如果可能,是否也可以过滤 public
和 private
字段?(类似于 Java 的 Modifier.isPrivate(field.getModifiers())
)
如何获取 Kotlin 数据类的 declaredFields
列表?类似于 Java 的 getDeclaredFields()
。
如果可能,是否也可以过滤 public
和 private
字段?(类似于 Java 的 Modifier.isPrivate(field.getModifiers())
)
MyClass::class.declaredMemberProperties
通过Java反射也可以获取字段:
MyClass::class.java.declaredFields
但在Kotlin中,字段更多的是一种实现细节,因为一些属性可能没有支持字段。
val p = MyClass::class.declaredMemberProperties.first()
val modifiers = p.javaGetter?.modifiers
注意:如果只是使用简单的private val
或@JvmField
,则为null
。然后,您可以检查p.javaField
。
然后,如果modifiers
不为null
,只需使用Modifier.isPrivate(...)
进行检查。
Kotlin中的属性可以具有分别为getter和setter设置的可见性修饰符,但setter访问权限不能比getter更宽松,这实际上就是属性的可见性。
declaredFields
的 Field.name
值? - Ivar Reukerspublic static final String
,我能获取它的字符串值吗? - quangkidimport kotlin.reflect.full.declaredMemberProperties
,以防万一IDE没有建议。 - kleniumMyClass::class.java.declaredFields
或它的实例:myObject::class.java.declaredFields
。最好的方法是检查哪些成员是KProperty1<*,*>
的子类。
MyClass::class.members.filter{
when(it){
is KProperty1<*,*> -> true
else -> false
}
}.map{ it as KProperty<MyClass,*> }
KProperty1
?如文档所述(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/-k-property/),KProperty0
用于静态属性(如在包的根目录中定义的属性)。KProperty2
用于扩展属性,而KProperty1
用于字段。