リフレクションの基礎
実行時に型を調べます
「リフレクションの基礎」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
リフレクションとは
リフレクションとは、実行時にプログラム自身の構造(クラス、プロパティ、関数、アノテーションなど)を調べたり操作したりする機能です。
Kotlinのリフレクションはkotlin.reflectパッケージにあり、KClassを中心に構成されています。
KClassの取得
型またはインスタンスに::class構文を使うと、そのKClassオブジェクトを取得できます。
class Robot
fun main() {
val fromType = Robot::class
val fromInstance = Robot()::class
println(fromType.simpleName)
println(fromInstance.simpleName)
}クラスの名前
KClassはsimpleNameとqualifiedNameを公開します。修飾名にはパッケージのパスが含まれます。
class Engine
fun main() {
val k = Engine::class
println(k.simpleName)
println(k.qualifiedName)
}プロパティの調査
memberPropertiesはクラスのプロパティを一覧表示します。それぞれがKPropertyであり、そのnameを取得できます。
import kotlin.reflect.full.memberProperties
class Point(val x: Int, val y: Int)
fun main() {
for (p in Point::class.memberProperties) {
println(p.name)
}
}プロパティ値の読み取り
KProperty1はインスタンスを渡して呼び出すことで、get(instance)を通じて値を読み取れます。
import kotlin.reflect.full.memberProperties
class Point(val x: Int, val y: Int)
fun main() {
val p = Point(3, 4)
for (prop in Point::class.memberProperties) {
println(prop.name + " = " + prop.get(p))
}
}関数の調査
memberFunctionsは、クラスの呼び出し可能な関数をKFunctionオブジェクトとして返します。それぞれの関数のnameを読み取れます。
import kotlin.reflect.full.memberFunctions
class Calculator {
fun add(a: Int, b: Int) = a + b
fun negate(a: Int) = -a
}
fun main() {
Calculator::class.memberFunctions
.filter { it.name in listOf("add", "negate") }
.forEach { println(it.name) }
}関数参照
::name構文は、KFunction型の呼び出し可能参照を生成します。後でinvokeを使って呼び出したり、値として渡したりできます。
fun double(n: Int) = n * 2
fun main() {
val ref = ::double
println(ref.name)
println(ref.invoke(21))
}インスタンスの生成
createInstance()は、クラスに引数なしのコンストラクターがある場合に、リフレクションでオブジェクトを生成します。
import kotlin.reflect.full.createInstance
class Widget {
override fun toString() = "Widget"
}
fun main() {
val w = Widget::class.createInstance()
println(w)
}コンストラクターの調査
constructorsはクラスのコンストラクターを一覧表示します。そのparametersを調べると、どのような引数を受け取るかが分かります。
class Person(val name: String, val age: Int)
fun main() {
val ctor = Person::class.constructors.first()
ctor.parameters.forEach { println(it.name) }
}コストと注意点
リフレクションは強力ですが、次の点に注意が必要です。
- 直接呼び出すより低速です
- コンパイル時の安全性を迂回します
- JVMでは
kotlin-reflectライブラリが必要です
リフレクションはフレームワークやツールに使い、頻繁に実行するループでは使わないでください。
リフレクションのツールボックス
覚えておきたい主な型は次のとおりです。
KClass— クラスKProperty— プロパティKFunction— 関数KParameter— パラメーター
これらを組み合わせると、構造を動的に読み取れます。
クイックチェック
リフレクションの基本について理解度を確認しましょう。
振り返り
リフレクションの基本を学びました。
::classによるKClassの取得memberPropertiesとmemberFunctionsの一覧表示- プロパティ値の読み取りと関数参照の呼び出し
createInstance()によるオブジェクトの生成
次は、アノテーションを動的に読み取ります。
よくある質問
「リフレクションの基礎」レッスンは無料ですか?
はい。「リフレクションの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「リフレクションの基礎」で何を学びますか?
実行時に型を調べます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「リフレクションの基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- アノテーションの使用
- アノテーションの定義
- リフレクションの基礎
- 実践的なリフレクション