Kotlin學(xué)習(xí)筆記:概述
Kotlin學(xué)習(xí)筆記:基本語(yǔ)法和函數(shù)
Kotlin學(xué)習(xí)筆記:類和接口
Kotlin學(xué)習(xí)筆記:lambda編程
Kotlin學(xué)習(xí)筆記:類型系統(tǒng)
Kotlin學(xué)習(xí)筆記:泛型
Kotlin學(xué)習(xí)筆記:注解和反射
注解
自定義注解
annotation class MyAnnotation{
}
元注解
-
@Target
指定可以用該注解標(biāo)注的元素的可能的類型(類暮刃、函數(shù)巷疼、屬性、表達(dá)式等)洪碳; -
@Retention
指定該注解是否存儲(chǔ)在編譯后的 class 文件中瘪撇,以及它在運(yùn)行時(shí)能否通過(guò)反射可見(jiàn) (默認(rèn)都是 true)感局; -
@Repeatable
允許在單個(gè)元素上多次使用相同的該注解扫茅; -
@MustBeDocumented
指定該注解是公有 API 的一部分,并且應(yīng)該包含在生成的 API 文檔中顯示的類或方法的簽名中逗嫡。
注解使用處目標(biāo)
當(dāng)對(duì)屬性或主構(gòu)造函數(shù)參數(shù)進(jìn)行標(biāo)注時(shí)青自,從相應(yīng)的 Kotlin 元素生成的 Java 元素會(huì)有多個(gè),因此在生成的 Java 字節(jié)碼中該注解有多個(gè)可能位置 驱证。如果要指定精確地指定應(yīng)該如何生成該注解延窜,請(qǐng)使用以下語(yǔ)法:
class Example(@field:Ann val foo, // 標(biāo)注 Java 字段
@get:Ann val bar, // 標(biāo)注 Java getter
@param:Ann val quux) // 標(biāo)注 Java 構(gòu)造函數(shù)參數(shù)
支持的使用處目標(biāo)的完整列表為:
-
file
; -
property
(具有此目標(biāo)的注解對(duì) Java 不可見(jiàn))抹锄; -
field
逆瑞; -
get
(屬性 getter)荠藤; -
set
(屬性 setter); -
receiver
(擴(kuò)展函數(shù)或?qū)傩缘慕邮照邊?shù))获高; -
param
(構(gòu)造函數(shù)參數(shù))哈肖; -
setparam
(屬性 setter 參數(shù)); -
delegate
(為委托屬性存儲(chǔ)其委托實(shí)例的字段)念秧。
反射
反射淤井,簡(jiǎn)單點(diǎn)說(shuō),就是可以在運(yùn)行時(shí)動(dòng)態(tài)的訪問(wèn)對(duì)象屬性和方法的方式
Kotlin 反射API
- 類引用(KClass)
最基本的反射功能是獲取 Kotlin 類的運(yùn)行時(shí)引用摊趾。要獲取對(duì)靜態(tài)已知的 Kotlin 類的引用币狠,可以使用 類字面值 語(yǔ)法:
val c = MyClass::class
Kotlin類引用和Java類引用不同。如果要獲得Java類引用砾层,需要改成MyClass::class.java
漩绵。
可調(diào)用引用
函數(shù)、屬性以及構(gòu)造函數(shù)的引用肛炮,除了作為自省程序結(jié)構(gòu)外止吐, 還可以用于調(diào)用或者用作函數(shù)類型的實(shí)例。
所有可調(diào)用引用的公共超類型是 KCallable
侨糟, 其中 R
是返回值類型祟印,對(duì)于屬性是屬性類型,對(duì)于構(gòu)造函數(shù)是所構(gòu)造類型粟害。
函數(shù)引用
當(dāng)我們有一個(gè)命名函數(shù)聲明如下:
fun isOdd(x: Int) = x % 2 != 0
我們可以很容易地直接調(diào)用它(isOdd(5)
),但是我們也可以將其作為一個(gè)函數(shù)類型的值颤芬,例如將其傳給另一個(gè)函數(shù)悲幅。為此,我們使用 ::
操作符:
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd))
這里 ::isOdd
是函數(shù)類型 (Int) -> Boolean
的一個(gè)值站蝠。
函數(shù)引用屬于 KFunction
的子類型之一汰具,取決于參數(shù)個(gè)數(shù),例如 KFunction3<T1, T2, T3, R>
菱魔。
屬性引用
要把屬性作為 Kotlin中 的一等對(duì)象來(lái)訪問(wèn)留荔,我們也可以使用 ::
運(yùn)算符:
val x = 1
fun main() {
println(::x.get())
println(::x.name)
}
表達(dá)式 ::x
求值為 KProperty<Int>
類型的屬性對(duì)象,它允許我們使用 get()
讀取它的值澜倦,或者使用 name
屬性來(lái)獲取屬性名辅柴。更多信息請(qǐng)參見(jiàn)關(guān)于 KProperty
類的文檔肌括。
構(gòu)造函數(shù)引用
構(gòu)造函數(shù)可以像方法和屬性那樣引用。他們可以用于期待這樣的函數(shù)類型對(duì)象的任何地方:它與該構(gòu)造函數(shù)接受相同參數(shù)并且返回相應(yīng)類型的對(duì)象。 通過(guò)使用 ::
操作符并添加類名來(lái)引用構(gòu)造函數(shù)烹棉。考慮下面的函數(shù)闷盔, 它期待一個(gè)無(wú)參并返回 Foo
類型的函數(shù)參數(shù):
class Foo
fun function(factory: () -> Foo) {
val x: Foo = factory()
}
使用 ::Foo
劲弦,類 Foo 的零參數(shù)構(gòu)造函數(shù)倍宾,我們可以這樣簡(jiǎn)單地調(diào)用它:
function(::Foo)
構(gòu)造函數(shù)的可調(diào)用引用的類型也是 KFunction
的子類型之一 ,取決于其參數(shù)個(gè)數(shù)胜嗓。