Kotlin Reflection:KClass、KFunction、KProperty
KClassを使ってクラスメタデータを扱い、リフレクションでメンバーを調べます。
「Kotlin Reflection:KClass、KFunction、KProperty」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
リフレクションとは
リフレクションを使うと、コードは実行時に自身の構造(クラス、関数、プロパティ、アノテーション、コンストラクタ)を調べて呼び出せます。KotlinはJVMのリフレクションAPIを、kotlin.reflectパッケージにある独自の、より豊富な型でラップしています。
KClassを取得する
型またはインスタンスに対して::classを使用すると、KClass参照を取得できます。
val klass: KClass<String> = String::class
val instance: KClass<out Any> = "hello"::class
println(klass.simpleName) // "String"KClassのプロパティ
KClassはクラスに関するメタデータを公開します。
val klass = String::class
println(klass.simpleName) // "String"
println(klass.qualifiedName) // "kotlin.String"
println(klass.isAbstract) // false
println(klass.constructors.size) // number of constructorsKFunction:呼び出し可能参照
::functionNameを使用すると、KFunction参照を取得できます。そのパラメータを調べたり、関数を呼び出したりできます。
fun greet(name: String) = "Hello, $name!"
val fn: KFunction<String> = ::greet
println(fn.name) // "greet"
println(fn.call("Kotlin")) // "Hello, Kotlin!"パラメータを調べる
KFunction.parametersは、名前、型、オプション性を持つKParameterオブジェクトのリストを返します。
fun add(a: Int, b: Int) = a + b
::add.parameters.forEach {
println("${it.name}: ${it.type}")
}
// a: kotlin.Int
// b: kotlin.IntKProperty:プロパティ参照
プロパティ参照は、プロパティを第一級オブジェクトとして扱えるようにします。KProperty0はレシーバーのないプロパティに使用し、KProperty1<T, R>はメンバープロパティに使用します。
data class User(val name: String, val age: Int)
val prop: KProperty1<User, String> = User::name
val user = User("Alice", 30)
println(prop.get(user)) // "Alice"KMutablePropertyによる可変プロパティ
varプロパティの場合、参照はset関数も持つKMutableProperty1になります。
class Box(var value: Int)
val prop: KMutableProperty1<Box, Int> = Box::value
val box = Box(10)
prop.set(box, 42)
println(box.value) // 42すべてのメンバーを一覧表示する
KClass.membersは、参照可能なすべてのメンバー(関数とプロパティ)を返します。KClass.declaredMemberPropertiesは、そのクラスで宣言されたプロパティだけを返します。
data class Point(val x: Int, val y: Int)
Point::class.declaredMemberProperties.forEach {
println(it.name) // "x", "y"
}KClassでインスタンスを生成する
KClass.createInstance()を呼び出すと(引数なしのコンストラクタが必要です)、またはKClass.constructorsを使うと、生成方法を細かく制御できます。
class Counter {
var count = 0
}
val c = Counter::class.createInstance()
c.count = 5
println(c.count) // 5Kotlinリフレクションの依存関係
Kotlinリフレクションにはkotlin-reflectアーティファクトが必要です(stdlibには含まれていません)。ビルドに追加してください。
// build.gradle.kts
implementation("org.jetbrains.kotlin:kotlin-reflect")パフォーマンスに関する注意
リフレクションは直接コードを実行する場合より大幅に低速です。KClass、KFunction、KPropertyの参照は起動時にキャッシュしてください。頻繁に実行されるループ内で呼び出すことは避けてください。ほとんどのツールやフレームワークのコードでは、このコストは許容できます。
クイックチェック
メンバープロパティへの参照を表し、インスタンスからその値を読み取れるKotlinの型はどれですか?
まとめ:Kotlinリフレクション
主な型:
KClass— クラスのメタデータ、コンストラクタ、メンバーKFunction— 呼び出し可能参照、パラメータ、呼び出しKProperty1/KMutableProperty1— プロパティ参照、get/set- クラスパスに
kotlin-reflectが必要 - 参照をキャッシュし、頻繁に実行される処理では使用を避ける
よくある質問
「Kotlin Reflection:KClass、KFunction、KProperty」レッスンは無料ですか?
はい。「Kotlin Reflection:KClass、KFunction、KProperty」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「Kotlin Reflection:KClass、KFunction、KProperty」で何を学びますか?
KClassを使ってクラスメタデータを扱い、リフレクションでメンバーを調べます。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Kotlin Reflection:KClass、KFunction、KProperty」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Kotlin Reflection:KClass、KFunction、KProperty
- カスタムアノテーションの作成と対象指定
- 実行時にアノテーションを読み取る
- リフレクションベースのバリデーションとマッピング