文章目錄
- 定義
- 注解類的注解
- 標注目標聲明
定義
注解使用annotation
關鍵字定義,且只能用于普通類,該類被稱為注釋類。可以使用@注釋類
為某個變量、函數、類、接口等注釋。與我們寫的代碼注釋類似,注釋類可以指明被標注類的狀態、作用等等(注解一般是在代碼檢查、編譯時使用,非專業人士了解一下即可,會用就行)。
// 定義注解
annotation class MyAnnotation()// 標注變量(無論寫在同一行還是換行都行)
@MyAnnotation val name = "Kotlin"// 標注函數
@MyAnnotation
fun getName() = name// 標注 lambda 函數
val myLambda = @MyAnnotation {}// 標注主構造函數(需要給出 constructor 關鍵字)
class MyClazz @MyAnnotation constructor()// 標注 getter
val kVersion@MyAnnotationget() = "2.0.0"// 標注類
@MyAnnotation
class MyClass// 標注接口
@MyAnnotation
interface MyInterface
注解類中**不能聲明成員(變量或方法),但可以在構造函數處聲明成員變量。
如果注解類構造函數有參數,在標注時可以傳入:
annotation class MyAnnotation(val name: String)@MyAnnotation("MyClass")
class MyClass
注解類的注解
可以對注解類進行注解標記,以滿足我們的需求(以下這些注解只能用于標注注解類)。
@Target
用于指定可被注解類標記的類型,可以傳入0個(此時無法標注)或多個枚舉類AnnotationTarget
的值。// 指定只能對類別名 typealias 使用 @Target(AnnotationTarget.TYPEALIAS) annotation class MyAnnotation()@MyAnnotation typealias Anything = Any// @MyAnnotation 此時不能標記 MyClass class MyClass
@Retention
指定該注解是否存在于編譯后的 class 文件中和是否在運行時反射可見,默認都為true
(非專業人士表示不懂)。@Repeatable
指定該注解可以多次用于同一目標。默認為false
。@MustBeDocumented
指明該注解是公共 API(public API)并且在生成 API(generated API)的類或方法標簽名中應該說明(非專業人士)。
標注目標聲明
當我們標注時,可以聲明被標注的目標:
annotation class MyAnnotation// 標注 setter
@set:MyAnnotation
var name = "Kotlin"
可以使用的目標聲明有:
file
property
field
get
set
receiver
param
setparam
delegate