Рефлексия в Kotlin/JS
Kotlin/JS предоставляет ограниченную поддержку API рефлексии Kotlin. Поддерживаются только следующие части API:
ссылки на классы (
::class).
Ссылки на классы
Синтаксис ::class возвращает ссылку на класс экземпляра или класс, соответствующий заданному типу. В Kotlin/JS значение выражения ::class — это урезанная реализация KClass, которая поддерживает только:
имя и isInstance() члены.
cast() и safeCast() расширяющие функции.
Помимо этого, можно использовать KClass.js для доступа к экземпляру JsClass, соответствующему классу. Сам экземпляр JsClass является ссылкой на функцию-конструктор. Это можно использовать для взаимодействия с JS-функциями, которые ожидают ссылки на конструктор.
KType и typeOf()
Функция typeof() создаёт экземпляр KType для заданного типа. API KType полностью поддерживается в Kotlin/JS за исключением частей, специфичных для Java.
Пример
Вот пример использования рефлексии в Kotlin/JS.
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"
}
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/js-reflection.html