Kotlin 基礎(chǔ)教程之反射
Kotlin 基礎(chǔ)教程之反射
概述
反射是語言與庫中的一組功能, 可以在運(yùn)行時刻獲取程序本身的信息.在Kotlin中,不僅可以通過發(fā)射獲取類的信息,同時可以獲取函數(shù)和屬性的信息。也就是說,在在運(yùn)行時刻得到一個函數(shù)或?qū)傩缘拿Q和數(shù)據(jù)類型) 可以通過簡單的函數(shù)式, 或交互式的編程方式實(shí)現(xiàn).
在Java平臺上, 使用反射功能所需要的運(yùn)行時組件是作為一個單獨(dú)的JAR文件發(fā)布的( kotlinreflect.jar). 這是為了對那些不使用反射功能的應(yīng)用程序, 減少其運(yùn)行庫的大小. 如果你需要使用反射, 請注意將這個.jar文件添加到你的項(xiàng)目的classpath中.
類引用
最基本的反射功能就是獲取一個 Kotlin 類的運(yùn)行時引用. 要得到一個靜態(tài)的已知的 Kotlin 類的引用, 可以使用類字面值(class literal) 語法:
val c = MyClass::class
類引用是一個 KClass 類型的值.
在Kotlin中定義了系列的常量,來表示類的信息.
- simpleName: String? 類的名稱
- qualifiedName: String? 類的全稱,包括包名
- members: Collection
函數(shù)引用
使用 :: 操作符來實(shí)現(xiàn)函數(shù)的引用。在高級函數(shù)中,我們通常使用函數(shù)作為參數(shù),在傳遞函數(shù)參數(shù)時通常都是用的函數(shù)引用,當(dāng)時還不太理解,現(xiàn)在終于解惑了。
fun main(args: Array<String>) {
val ages = listOf(18, 23, 17, 25)
ages.filter(::isOld)
.forEach(::println) // 打?。?3,25
}
fun isOld(age: Int): Boolean = age > 20
這里,::isOdd 是一個 (Int) -> Boolean 函數(shù)類型的值。
如果我們需要使用一個類的成員函數(shù), 或者一個擴(kuò)展函數(shù), 就必須使用限定符. 比如, String::toCharArray指向 String 上的一個擴(kuò)展函數(shù), 函數(shù)類型為: String.() -> CharArray
屬性引用
在Kotlin中, 對于包級別的屬性可以作為對象來訪問, 方法是使用 :: 操作符,我們可以獲取一個類型為 KProperty對象。
var x = 1
fun main(args: Array<String>) {
println(::x.get()) // 打印結(jié)果為: "1"
::x.set(2)
println(x) // 打印結(jié)果為: "2"
}
注
- 對于val屬性,我們可以通過KProperty的get()函數(shù)可以得到屬性值, 通過它的 name 屬性可以得到屬性名稱.
- 對于var屬性,返回的屬性對象的類型為 KMutableProperty, 我們不僅可以通過get()和name獲取該對象的屬性值和屬性名稱,還可以通過set()函數(shù)設(shè)置其屬性值。
- 對于訪問類的成員屬性, 我們需要使用限定符。返回的屬性對象的類型為KProperty1
構(gòu)造器引用
構(gòu)造器引用可以用于使用函數(shù)類型對象的地方, 但這個函數(shù)類型接受的參數(shù)應(yīng)該與構(gòu)造器相同, 返回值應(yīng)該是構(gòu)造器所屬類的對象實(shí)例. 引用構(gòu)造器使用 :: 操作符, 再加上類名稱.
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)
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
SpringBoot構(gòu)造器注入循環(huán)依賴及解決方案
這篇文章主要介紹了SpringBoot構(gòu)造器注入循環(huán)依賴及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
SpringBoot中的@PostConstruct注解詳細(xì)解析
這篇文章主要介紹了SpringBoot中的@PostConstruct注解詳細(xì)解析,@PostConstruct注解,主要用于在Spring容器啟動時執(zhí)行某些操作或者任務(wù),@PostConstruct注解一般放在BEAN的方法上,一旦BEAN初始化完成之后,將會調(diào)用這個方法,需要的朋友可以參考下2024-01-01
Java三目運(yùn)算符的實(shí)戰(zhàn)案例
三目運(yùn)算符在java中運(yùn)用可以說非常的廣泛,下面這篇文章主要給大家介紹了關(guān)于Java三目運(yùn)算符的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫
這篇文章主要介紹了java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫,需要的朋友可以參考下2020-02-02
spring boot+自定義 AOP 實(shí)現(xiàn)全局校驗(yàn)的實(shí)例代碼
最近公司重構(gòu)項(xiàng)目,重構(gòu)為最熱的微服務(wù)框架 spring boot, 重構(gòu)的時候遇到幾個可以統(tǒng)一處理的問題。這篇文章主要介紹了spring boot+自定義 AOP 實(shí)現(xiàn)全局校驗(yàn) ,需要的朋友可以參考下2019-04-04
springboot結(jié)合前端實(shí)現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能實(shí)例
今天處理Springboot統(tǒng)一異常攔截的時候,遇到了頁面跳轉(zhuǎn)的問題,這篇文章主要給大家介紹了關(guān)于springboot結(jié)合前端實(shí)現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12

