【问题标题】:Kotlin reflection - getting all field names of a ClassKotlin 反射 - 获取类的所有字段名称
【发布时间】:2022-01-08 21:27:07
【问题描述】:

如何获取 Kotlin 数据类列表 declaredFields?喜欢Java的getDeclaredFields()

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

【问题讨论】:

  • 您对字段(即原始 java 类)或属性(即 javabean 或 Kotlin 类)感兴趣吗?您是只处理 Kotlin 类还是 Java 类?
  • 只有 Kotlin 类,但 @hotkey 的解决方案适用于我的特定问题
  • 没有关于此调用的文档”——该文档的链接如下。
  • 我知道,后来看到它,我一开始找不到它/不知道要搜索什么,所以我错过了那个文档

标签: java reflection kotlin


【解决方案1】:

最好的方法是检查哪些成员是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】:

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

    【讨论】:

      【解决方案3】:

      确实有可用于 Kotlin 反射的文档:an overall summary of reflectionAPI docs,包括 KClass.members 函数。您也可以跳转到该方法的声明,您会看到它也记录在源代码中。

      【讨论】:

        【解决方案4】:

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

        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@JvmField 用法,则为null。然后你可以改为检查p.javaField

        那么,如果modifiers 不是null,只需检查Modifier.isPrivate(...)

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

        【讨论】:

        • 是否可以创建一个 MyClass 对象,并使用 Field.name 设置这些 declaredFields(使用 Java 反射)?
        • 如果java类有一个字段是public static final String,我可以得到它的字符串值吗?
        • import kotlin.reflect.full.declaredMemberProperties 让它工作,以防 IDE 不建议这样做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 2013-02-25
        • 2013-04-24
        • 1970-01-01
        相关资源
        最近更新 更多