有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

如何获取Kotlin数据类的列表,它是declaredFields?就像Java的getDeclaredFields()

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


共 (4) 个答案

  1. # 2 楼答案

    最好的方法是检查哪些成员是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表示字段

    如果只需要声明的属性,可以将其与Java反射混合使用

  2. # 3 楼答案

    可能您想要的是获取类的属性,而不是字段。这可以通过以下方式实现:

    MyClass::class.declaredMemberProperties
    

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

    MyClass::class.java.declaredFields
    

    但是字段在Kotlin中是一个实现细节,因为有些属性可能没有backing field


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

    val p = MyClass::class.declaredMemberProperties.first()
    val modifiers = p.javaGetter?.modifiers
    

    注意:对于简单的private val^{}用法,它是null。然后你可以检查p.javaField

    然后,如果modifiers不是null,就用Modifier.isPrivate(...)检查一下

    Kotlin中的属性可以有separate visibility modifiers for getter and setter,但setter访问权限不能比getter访问权限更大,getter访问权限实际上是属性可见性

  3. # 4 楼答案

    使用MyClass::class.java.declaredFields或其实例:myObject::class.java.declaredFields