[英]Kotlin reflection - getting all field names of a Class
我怎樣才能得到一個科特林數據類是列表declaredFields
? 就像 Java 的getDeclaredFields()
如果這是可能的,是否也可以過濾public
和private
領域? (就像 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.