概述
反射是語言與庫中的一組功能, 可以在運行時刻獲取程序本身的信息.在Kotlin中,不僅可以通過發射獲取類的信息,同時可以獲取函數和屬性的信息。也就是說,在在運行時刻得到一個函數或屬性的名稱和數據類型) 可以通過簡單的函數式, 或交互式的編程方式實現.
在Java平臺上, 使用反射功能所需要的運行時組件是作為一個單獨的JAR文件發布的( kotlinreflect.jar). 這是為了對那些不使用反射功能的應用程序, 減少其運行庫的大小. 如果你需要使用反射, 請注意將這個.jar文件添加到你的項目的classpath中.
類引用
最基本的反射功能就是獲取一個 Kotlin 類的運行時引用. 要得到一個靜態的已知的 Kotlin 類的引用, 可以使用類字面值(class literal) 語法:
1
|
val c = MyClass:: class |
類引用是一個 KClass 類型的值.
在Kotlin中定義了系列的常量,來表示類的信息.
- simpleName: String? 類的名稱
- qualifiedName: String? 類的全稱,包括包名
- members: Collection
函數引用
使用 :: 操作符來實現函數的引用。在高級函數中,我們通常使用函數作為參數,在傳遞函數參數時通常都是用的函數引用,當時還不太理解,現在終于解惑了。
1
2
3
4
5
6
7
|
fun main(args: Array<String>) { val ages = listOf( 18 , 23 , 17 , 25 ) ages.filter(::isOld) .forEach(::println) // 打印:23,25 } fun isOld(age: Int): Boolean = age > 20 |
這里,::isOdd 是一個 (Int) -> Boolean 函數類型的值。
如果我們需要使用一個類的成員函數, 或者一個擴展函數, 就必須使用限定符. 比如, String::toCharArray指向 String 上的一個擴展函數, 函數類型為: String.() -> CharArray
屬性引用
在Kotlin中, 對于包級別的屬性可以作為對象來訪問, 方法是使用 :: 操作符,我們可以獲取一個類型為 KProperty對象。
1
2
3
4
5
6
|
var x = 1 fun main(args: Array<String>) { println(::x.get()) // 打印結果為: "1" ::x.set( 2 ) println(x) // 打印結果為: "2" } |
注
- 對于val屬性,我們可以通過KProperty的get()函數可以得到屬性值, 通過它的 name 屬性可以得到屬性名稱.
- 對于var屬性,返回的屬性對象的類型為 KMutableProperty, 我們不僅可以通過get()和name獲取該對象的屬性值和屬性名稱,還可以通過set()函數設置其屬性值。
- 對于訪問類的成員屬性, 我們需要使用限定符。返回的屬性對象的類型為KProperty1
構造器引用
構造器引用可以用于使用函數類型對象的地方, 但這個函數類型接受的參數應該與構造器相同, 返回值應該是構造器所屬類的對象實例. 引用構造器使用 :: 操作符, 再加上類名稱.
1
2
3
4
5
6
7
|
fun main(args: Array<String>) { var person = newPerson( "Jone" , 20 , "SH" , ::Person) } fun newPerson(name: String, age: Int, address: String, factory: (String, Int, String) -> Person) : Person{ return factory(name, age, address) } |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/io_field/article/details/53572565