Kotlin/JS 리플렉션
Kotlin/JS 리플렉션
Kotlin/JS는 Kotlin reflection 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에서 리플렉션을 사용하는 예시예요.
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"
}