Kotlin註解

註解用於在編譯時將元數據附加到類,接口,參數等。 編譯器可以在運行時反射註解。可以根據註解值更改數據或程序的含義。

Kotlin 元註解(Meta-annotations)

可以在聲明註解時添加元信息。 以下是一些元註解的說明:

註解名稱

描述

[@Target](https://github.com/Target "@Target")

它針對可以使用註解進行註解的所有可能類型的元素。

[@Retention](https://github.com/Retention "@Retention")

它指定註解是否存儲在已編譯的類文件中,或者是否在運行時通過反射顯示。

[@Repeatable](https://github.com/Repeatable "@Repeatable")

此元註解確定註解在單個代碼元素上適用兩次或更多次。

[@MustBeDocumented](https://github.com/MustBeDocumented "@MustBeDocumented")

此元文檔指定註解是公共API的一部分,應包含在類或方法中。

使用註解的示例

@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,  
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)  
@Retention(AnnotationRetention.SOURCE)  
@MustBeDocumented  
annotation class MyClass

聲明註解

通過將註解修飾符放在類的前面來聲明註解。

annotation class MyClass

註解構造函數

也可以註解類的構造函數。 這是通過爲構造函數聲明添加構造函數關鍵字並在它的前面放置註解來完成的。

class [email protected] constructor( dependency: MyDependency){  
//. . .   
}

註解屬性訪問器

class MyClass{  
var a: MyDependency? = null  
                    @Inject set  
}

使用構造函數作爲註解

也可以使用構造函數作爲註解,使用構造函數作爲註解需要參數。

annotation class MyClass(val why: String)  
@MyClass("parameter") class Foo{  
}

用作註解的參數不能是可空類型,這是因爲JVM不支持null作爲註解屬性的值。也可以使用一個註解作爲另一個註解的參數,在這種情況下它不能使用前綴@字符。 例如:

annotation class ReplaceWith(val expression: String)  
annotation class Deprecated(  
val message: String,  
val replaceWith: ReplaceWith = ReplaceWith(""))  
@Deprecated("This function is deprecated, use === instead", ReplaceWith("this === other"))

Kotlin還指定一個類可以使用KClass來獲取註解的參數。 Kotlin編譯器自動將它轉換爲java類,這就像通常看到註解和參數。

import kotlin.reflect.KClass  
annotation class MyClass(val arg1: KClass<*>, val arg2: KClass<out Any>)  
@MyClass(String::class, Int::class) class Foo

使用TYPE註解的示例

創建一個java註解接口Ann.java -

import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
@Target(ElementType.TYPE)  
@Retention(RetentionPolicy.RUNTIME)  
@interface  Ann{  
    int value();  
}

創建一個使用Ann接口註解的MyClass.kt類。

@Ann(value = 10)  
class MyClass{  

}  
fun main (args: Array<String>){  
    var c = MyClass()  
    var x = c.javaClass.getAnnotation(Ann::class.java)  
    if(x!=null){  
        println("Value:"+x?.value)  
    }  
}

執行上面示例代碼,得到以下結果 -

Value: 10