簡體   English   中英

Kotlin 反射 - 獲取類的所有字段名稱

[英]Kotlin reflection - getting all field names of a Class

我怎樣才能得到一個科特林數據類是列表declaredFields 就像 Java 的getDeclaredFields()

如果這是可能的,是否也可以過濾publicprivate領域? (就像 Java 的Modifier.isPrivate(field.getModifiers())

可能您想要的是獲取類的屬性,而不是字段。 這可以按如下方式完成:

MyClass::class.declaredMemberProperties

也可以通過 Java 反射獲取字段:

MyClass::class.java.declaredFields

但是字段在 Kotlin 中更像是一個實現細節,因為某些屬性可能沒有支持字段


至於可見性,對於屬性,您可以檢查 getter 可見性修飾符:

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 更寬松,后者實際上是屬性可見性。

確實有可用於 Kotlin 反射的文檔:反射API 文檔的總體摘要,包括KClass.members函數。 您還可以跳轉到該方法的聲明,您將看到它也記錄在源代碼中。

使用MyClass::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為靜態屬性(如那些在packate的根定義)。 KProperty2用於擴展屬性, KProperty1用於字段。

如果您只需要聲明的屬性,它可以與 Java 反射混合使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM