35

プロパティ名が実行時にしかわからない場合、Kotlin データ クラス インスタンスでプロパティの値を読み取るにはどうすればよいですか?

4

4 に答える 4

22

リフレクションを介して行うことができます。データ クラスと通常のクラスはすべて同じです。

最初のオプションは、Java リフレクションを使用することです。

val name = obj.javaClass
              .getMethod("getName") // to get property called `name`
              .invoke(obj)

拡張関数を作成することもできます:

inline fun <reified T : Any> Any.getThroughReflection(propertyName: String): T? {
    val getterName = "get" + propertyName.capitalize()
    return try {
        javaClass.getMethod(getterName).invoke(this) as? T
    } catch (e: NoSuchMethodException) {
        null
    }
}

public getter を呼び出します。プライベート プロパティの値を取得するには、 と を使用してこのコードを変更できgetDeclaredMethodますsetAccessible。これは、対応する getter を持つ Java オブジェクトに対しても機能します (ただし、およびgetterの規則がありません)。ishasboolean

そして使用法:

data class Person(val name: String, val employed: Boolean)

val p = Person("Jane", true)
val name = p.getThroughReflection<String>("name")
val employed = p.getThroughReflection<Boolean>("employed")

println("$name - $employed") // Jane - true


2番目のオプションはkotlin-reflect、プロジェクトに個別に追加する必要があるライブラリを使用することです。ここにそのドキュメントがあります。Javaゲッターを無視して、実際のKotlinプロパティ値を取得できます。

を使用javaClass.kotlinして実際の Kotlin クラス トークンを取得し、そこからプロパティを取得できます。

val name = p.javaClass.kotlin.memberProperties.first { it.name == "name" }.get(p)

このソリューションは、Java クラスではなく Kotlin クラスに対してのみ機能しますが、Kotlin クラスを使用する必要がある場合は、はるかに信頼性が高くなります。基盤となる実装に依存しません。

于 2016-02-20T16:14:41.990 に答える