跳至主要内容

Kotlin/JS 反射 (reflection)

Kotlin/JS 對 Kotlin reflection API 提供了有限的支援。唯一支援的 API 部分有:

類別參考 (Class references)

::class 語法會回傳一個實例的類別參考,或是對應於給定型別的類別。在 Kotlin/JS 中,::class 表達式的值是一個精簡版的 KClass 實作,僅支援:

除此之外,您可以使用 KClass.js 來存取對應於該類別的 JsClass 實例。JsClass 實例本身是對建構函式 (constructor function) 的參考。這可以用於與期望建構函式參考的 JS 函式進行互操作。

KType 和 typeOf()

typeof() 函式會為給定的型別建構一個 KType 實例。除了特定於 Java 的部分之外,Kotlin/JS 完全支援 KType API。

KClass 和 createInstance()

KClass 介面中的 createInstance() 函式會建立指定類別的新實例,這對於取得 Kotlin 類別的執行階段參考 (runtime reference) 很有用。

範例 (Example)

以下是在 Kotlin/JS 中使用 reflection 的範例。

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"
}