Kotlin/JSのリフレクション
Kotlin/JSは、KotlinのリフレクションAPIに対する限定的なサポートを提供します。このAPIでサポートされているのは、以下の部分のみです。
- クラス参照 (
::class) KTypeとtypeof()KClassとcreateInstance()
クラス参照
::class構文は、インスタンスのクラス、または指定された型に対応するクラスへの参照を返します。 Kotlin/JSでは、::class式の値は、以下の機能のみをサポートする簡略化されたKClass実装です。
- simpleNameおよびisInstance()メンバー。
- cast()およびsafeCast()拡張関数。
それに加えて、KClass.jsを使用して、クラスに対応するJsClassインスタンスにアクセスできます。 JsClassインスタンス自体は、コンストラクター関数への参照です。 これは、コンストラクターへの参照を期待するJavaScript関数と連携するために使用できます。
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) // Prints "Rectangle"
println(Shape::class.simpleName) // Prints "Shape"
println(Shape::class.js.name) // Prints "Shape"
println(Shape::class.isInstance(r)) // Prints "true"
println(Rectangle::class.isInstance(s)) // Prints "false"
val rShape = Shape::class.cast(r) // Casts a Rectangle "r" to Shape
accessReifiedTypeArg<Rectangle>() // Accesses the type via typeOf(). Prints "Rectangle"
}