Kotlin/JS のリフレクション
Kotlin/JS は、Kotlin のリフレクション APIを限定的にサポートしています。サポートされている API は以下の部分のみです:
クラス参照
::class 構文は、インスタンスのクラス、または指定された型に対応するクラスへの参照を返します。 Kotlin/JS では、::class 式の値は、以下のみをサポートする簡略化された KClass 実装となります:
- simpleName および isInstance() メンバ。
- cast() および safeCast() 拡張関数。
これに加えて、KClass.js を使用して、クラスに対応する JsClass インスタンスにアクセスできます。 JsClass インスタンス自体は、コンストラクタ関数への参照です。 これは、コンストラクタへの参照を期待する JS 関数と相互運用するために使用できます。
KType と typeOf()
typeof() 関数は、指定された型の KType インスタンスを構築します。 KType API は、Java 固有の部分を除き、Kotlin/JS で完全にサポートされています。
KClass と createInstance()
KClass インターフェースの createInstance() 関数は、指定されたクラスの新しいインスタンスを作成します。これは、Kotlin クラスへの実行時参照を取得するのに便利です。
例
以下は、Kotlin/JS におけるリフレクションの使用例です。
kotlin
open class Shape
class Rectangle : Shape()
inline fun <reified T> accessReifiedTypeArg() =
println(typeOf<T>().toString())
fun main() {
val s = Shape()
val r = Rectangle()
println(r::class.simpleName) // "Rectangle" を出力
println(Shape::class.simpleName) // "Shape" を出力
println(Shape::class.js.name) // "Shape" を出力
println(Shape::class.isInstance(r)) // "true" を出力
println(Rectangle::class.isInstance(s)) // "false" を出力
val rShape = Shape::class.cast(r) // Rectangle "r" を Shape にキャスト
accessReifiedTypeArg<Rectangle>() // typeOf() 経由で型にアクセス。"Rectangle" を出力
}