Kotlin/JS 리플렉션
Kotlin/JS는 Kotlin 리플렉션 API를 제한적으로 지원합니다. 지원되는 API 부분은 다음과 같습니다:
클래스 참조
::class 구문은 인스턴스의 클래스 또는 지정된 타입에 해당하는 클래스에 대한 참조를 반환합니다. Kotlin/JS에서 ::class 표현식의 값은 다음만을 지원하는 축소된(stripped-down) KClass 구현체입니다:
- simpleName 및 isInstance() 멤버.
- cast() 및 safeCast() 확장 함수.
그 외에도, KClass.js를 사용하여 클래스에 해당하는 JsClass 인스턴스에 접근할 수 있습니다. JsClass 인스턴스 자체는 생성자 함수(constructor function)에 대한 참조입니다. 이는 생성자 참조를 기대하는 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" 출력
}