リフレクション

Kotlinにおける**リフレクション(Reflection)**とは、プログラムの実行時に型、プロパティ、メソッドなどのメタ情報にアクセスしたり操作したりする仕組みのことです。Javaと同様に、Kotlinでもリフレクション機能を使うことで柔軟な動的処理が可能になりますが、Kotlin独自のリフレクションAPI(kotlin.reflectパッケージ)も提供されています。


1. 基本概念

リフレクションの用途

  • 実行時にクラスの型情報を取得したいとき

  • プロパティや関数に動的にアクセス・操作したいとき

  • アノテーションを読み取るとき

  • シリアライズや依存性注入などのフレームワーク構築時


2. 主なKotlinリフレクションAPI

KClass

Kotlinのクラスの型情報を表します。JavaでいうClassに相当。

kotlin
val clazz = MyClass::class println(clazz.simpleName) // クラス名を表示

KProperty

プロパティに関するメタ情報を取得できます。

kotlin
import kotlin.reflect.full.memberProperties data class Person(val name: String, val age: Int) val person = Person("Taro", 25) val kClass = person::class for (prop in kClass.memberProperties) { println("${prop.name} = ${prop.get(person)}") }

KFunction

関数やメソッドに関する情報を取得・呼び出しできます。

kotlin
fun greet(name: String) = "Hello, $name" val func = ::greet println(func.call("Kotlin")) // => Hello, Kotlin

3. Javaリフレクションとの連携

KotlinはJVM上で動作するため、java.lang.Classjava.lang.reflectのAPIも利用可能です。ただし、Kotlinらしい表現をしたい場合はkotlin.reflectを使う方が自然です。

kotlin
val clazz = Class.forName("com.example.MyClass") val constructor = clazz.getConstructor() val instance = constructor.newInstance()

4. kotlin-reflect ライブラリ

Kotlinの高度なリフレクション機能(例:KProperty, KFunctionなど)を使うには、標準ライブラリとは別に kotlin-reflect を明示的に依存に追加する必要があります。

Gradleの例:

kotlin
dependencies { implementation("org.jetbrains.kotlin:kotlin-reflect") }

5. リフレクションの注意点

  • パフォーマンス低下:リフレクションは動的に情報を取得するため、静的コードに比べて実行コストが高い。

  • 安全性の低下:コンパイル時に型チェックが効かないため、実行時エラーが発生しやすい。

  • モジュール間の依存:Kotlin/NativeやKotlin/JSではリフレクション機能が限定されるため、マルチプラットフォームでは注意が必要。


6. まとめ

要素 説明
KClass クラスのメタ情報
KProperty プロパティへのリフレクションアクセス
KFunction 関数・メソッドの呼び出し
Java互換 java.lang.Classなども利用可能
注意点 パフォーマンスや安全性に留意が必要

生成日:2025/05/04