首頁 >Java >java教程 >Kotlin的註解類別實例教學分享

Kotlin的註解類別實例教學分享

零下一度
零下一度原創
2017-06-17 11:54:551598瀏覽

這篇文章主要介紹了Kotlin 的註解類別詳解及實例的相關資料,需要的朋友可以參考下

Kotlin 的註解類別詳解及實例

#註解宣告

註解是將元資料附加到程式碼的方法。若要宣告註解,請將annotation 修飾符放在類別的前面:


annotation class Fancy

註解的附加屬性可以透過用元註解標註註解類別來指定:

  1. @Target 指定可以用該註解標註的元素的可能的型別(類別、函數、屬性、表達式等);

  2. @Retention 指定該註解是否儲存在編譯後的class 檔案中,以及它在執行時能否透過反射可見(預設都是true);

  3. @Repeatable 允許在單一元素上多次使用相同的該註解;

  4. @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 {}

允許的參數型別有:


  1. # 對應於Java 原生型別的型別(Int、 Long等) ;

  2. 字串

  3. #類別(Foo

    ::class);

  4. 枚舉;

  5. 其他註解;

  6. 上面已列類型的陣列。


註解參數不能有可空類型,因為 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 類,以便 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
}

支援的使用處目標的完整清單為:

  1. file

  2. property(具有此目標的註解對Java 不可見)

  3. field

  4. get(屬性getter)

  5. set(屬性setter)

  6. receiver(擴充函數或屬性的接收者參數)

  7. #param(建構子參數)

  8. setparam(屬性setter 參數)

  9. delegate(為委託屬性儲存其委託實例的欄位)


  10. ##要標註擴充函數的接收者參數,請使用下列語法:

fun @receiver:Fancy String.myExtension() { }

如果不指定使用處目標,則根據正在使用的註解的@Target 註解來選擇目標。如果有多個適用的目標,則使用下列清單中的第一個適用目標:

  • 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn