注解用於在編譯時將元數據附加到類,介面,參數等。 編譯器可以在運行時反射注解。可以根據注解值更改數據或程式的含義。
Kotlin 元注解(Meta-annotations)
可以在聲明注解時添加元資訊。 以下是一些元注解的說明:
注解名稱 | 描述 |
---|---|
@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
使用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
上一篇:
Kotlin HashSet類
下一篇:
Kotlin反射