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