註解用於在編譯時將後設資料附加到類,介面,引數等。 編譯器可以在執行時反射註解。可以根據註解值更改資料或程式的含義。
可以在宣告註解時新增元資訊。 以下是一些元註解的說明:
註解名稱 | 描述 |
---|---|
@Target |
它針對可以使用註解進行註解的所有可能型別的元素。 |
@Retention |
它指定註解是否儲存在已編譯的類檔案中,或者是否在執行時通過反射顯示。 |
@Repeatable |
此元註解確定註解在單個程式碼元素上適用兩次或更多次。 |
@MustBeDocumented |
此元文件指定註解是公共API的一部分,應包含在類或方法中。 |
使用註解的範例
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class MyClass
通過將註解修飾符放在類的前面來宣告註解。
annotation class MyClass
也可以註解類別建構函式。 這是通過為建構函式宣告新增建構函式關鍵字並在它的前面放置註解來完成的。
class MyClass@Inject 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
建立一個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