反射(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()
函式,它接受兩種不同的Int
和String
型別,並使用不同的型別引數呼叫此函式。
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()
函式使用name
和readits
值來檢索屬性名稱。
要重置可變型別屬性的值,參照屬性具有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