Kotlin反射


反射(Reflection)是一組語言和庫特性,用於在執行時檢查程式的結構。 Kotlin將函式和屬性作為語言中的一等公民,並在執行時檢查這些函式和屬性。

類參照

類參照用於獲取KClass物件的參照。 為了獲得靜態Kclass的參照,應該使用類文字(即使用雙冒號)。

類參照的語法:

val c1 = String::class  
val c2 = MyClass::class

參考值是KClass的類型別。 KClass類參照與Java類參照不同。 通過在KClass範例上使用.java屬性來獲取Java類參照。

注意:KClass代表一個類並提供檢查功能。 要獲取此類的範例,請使用語法:::class

函式參考

Kotlin函式用於獲得使用雙冒號的函式參考。 函式參照可以在另一個函式中用作引數。 要在另一個函式中使用此參照,使用::運算子:

fun isPositive(x: Int) = x> 0
fun isPositive(x: Int) = x> 0  
val number = listOf(-10,-5,0,5,10)  
print(number.filter(::isPositive))

Kotlin函式參照範例

fun main(args: Array<String>) {
    fun isPositive(x: Int) = x > 0
    val numbers = listOf(-10, -5, 0, 5, 10)
    println(numbers.filter(::isPositive))
}

執行上面範例程式碼,得到以下結果 -

[5,10]

在上面的程式中::isPositive是函式型別(Int)-> Boolean的值。

過載函式參照運算子(::)

當從上下文中獲知預期型別時,運算子::可以與過載函式一起使用。例如:

建立一個isPositive()函式,它接受兩種不同的IntString型別,並使用不同的型別引數呼叫此函式。

fun main(args: Array<String>) {
    fun isPositive(x: Int) = x > 0
    fun isPositive(s: String) = s== "kotlin" || s == "Kotlin"

    val numbers = listOf(-10,-5,0,5,10)
    val strings = listOf("kotlin", "program")

    println(numbers.filter(::isPositive))
    println(strings.filter(::isPositive))
}

執行上面範例程式碼,得到以下結果 -

[5, 10]
[kotlin]

屬性參考

也可以在Kotlin中存取屬性作為第一類物件,以存取可以使用的物件屬性::運算子:

要評估KProperty <Int>型別的屬性物件,使用表示式::variableName。表示式:: variableName可使用get()函式使用namereadits值來檢索屬性名稱。

要重置可變型別屬性的值,參照屬性具有set()方法。範例程式碼 -

fun main(args: Array<String>) {
    println(::x.get())
    println(::x.name)
    println(::y.set(10))
}
val x = 5
var y = 5

執行上面範例程式碼,得到以下結果 -

5
x
kotlin.Unit

存取成員類的屬性

屬性參照還可以存取其他類成員的屬性,例如:

class A(val x: Int)
fun main(args: Array<String>) {
    val prop = A::x
    println(prop.get(A(5)))
}

執行上面範例程式碼,得到以下結果 -

5