這篇文章主要介紹了Kotlin 的註解類別詳解及實例的相關資料,需要的朋友可以參考下
Kotlin 的註解類別詳解及實例
#註解宣告
註解是將元資料附加到程式碼的方法。若要宣告註解,請將annotation 修飾符放在類別的前面:
annotation class Fancy
註解的附加屬性可以透過用元註解標註註解類別來指定:
@Target 指定可以用該註解標註的元素的可能的型別(類別、函數、屬性、表達式等);
@Retention 指定該註解是否儲存在編譯後的class 檔案中,以及它在執行時能否透過反射可見(預設都是true);
@Repeatable 允許在單一元素上多次使用相同的該註解;
@MustBeDocumented 指定註解是公有API 的一部分,並且應該包含在產生的API 文檔中顯示的類別或方法的簽名中。
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@ Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class Fancy
#用法
@Fancy class Foo { @Fancy fun baz(@Fancy foo: Int): Int { return (@Fancy 1) } }
如果需要對類別的主建構子進行標註,則需要在建構函式宣告中新增constructor 關鍵字,並將註解加入其前面:
class Foo @Inject constructor(dependency: MyDependency) { // …… }
你也可以標註屬性存取器:
##
class Foo { var x: MyDependency? = null @Inject set }
#建構子
註解可以有接受參數的建構子。annotation class Special(val why: String) @Special("example") class Foo {}允許的參數型別有:
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 類,以便 Java 程式碼能夠正常看到該註解和參數 。
import kotlin.reflect.KClass annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>) @Ann(String::class, Int::class) class MyClass
Lambda 表達式
註解也可以用於 lambda 表達式。它們會被應用在產生 lambda 表達式體的 invoke() 方法上。這對於像 Quasar這樣的框架很有用, 該框架使用註解進行並發控制。annotation class Suspendable val f = @Suspendable { Fiber.sleep(10) }
註解使用處目標
#當屬性或主建構函數參數進行標註時,從對應的Kotlin 元素產生的Java 元素會有多個,因此在產生的Java 字節碼中該註解有多個可能位置。如果要指定精確地指定應該如何產生該註解,請使用下列語法:
#
class Example(@field:Ann val foo, // 标注 Java 字段 @get:Ann val bar, // 标注 Java getter @param:Ann val quux) // 标注 Java 构造函数参数可以使用相同的語法來標註整個檔案。 要做到這一點,把帶有目標file 的註解解放在檔案的頂層、package 指令之前或在所有導入之前(如果檔案在預設套件中的話):
@file:JvmName("Foo") package org.jetbrains.demo如果你對同一目標有多個註解,那麼可以這樣來避免目標重複-在目標後面加上方括號並將所有註解放在方括號內:
class Example { @set:[Inject VisibleForTesting] var collaborator: Collaborator }支援的使用處目標的完整清單為:
fun @receiver:Fancy String.myExtension() { }
param
property
field
Java 注解
Java 注解与 Kotlin 100% 兼容:
import org.junit.Test import org.junit.Assert.* import org.junit.Rule import org.junit.rules.* class Tests { // 将 @Rule 注解应用于属性 getter @get:Rule val tempFolder = TemporaryFolder() @Test fun simple() { val f = tempFolder.newFile() assertEquals(42, getTheAnswer()) } }
因为 Java 编写的注解没有定义参数顺序,所以不能使用常规函数调用 语法来传递参数。相反,你需要使用命名参数语法。
// Java public @interface Ann { int intValue(); String stringValue(); } // Kotlin @Ann(intValue = 1, stringValue = "abc") class C
就像在 Java 中一样,一个特殊的情况是 value 参数;它的值无需显式名称指定。
// Java public @interface AnnWithValue { String value(); } // Kotlin @AnnWithValue("abc") class C
如果 Java 中的 value 参数具有数组类型,它会成为 Kotlin 中的一个 vararg 参数:
// Java public @interface AnnWithArrayValue { String[] value(); } // Kotlin @AnnWithArrayValue("abc", "foo", "bar") class C
对于具有数组类型的其他参数,你需要显式使用 arrayOf:
// Java public @interface AnnWithArrayMethod { String[] names(); } // Kotlin @AnnWithArrayMethod(names = arrayOf("abc", "foo", "bar")) class C
注解实例的值会作为属性暴露给 Kotlin 代码。
// Java public @interface Ann { int value(); } // Kotlin fun foo(ann: Ann) { val i = ann.value }
以上是Kotlin的註解類別實例教學分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!