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

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

Jun 17, 2017 am 11:54 AM
kotlin 分享 實例 教學 註解

這篇文章主要介紹了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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1663
14
CakePHP 教程
1420
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
得物使用教程 得物使用教程 Mar 21, 2024 pm 01:40 PM

得物APP是當前十分火爆品牌購物的軟體,但是多數的用戶不知道得物APP中功能如何的使用,下方會整理最詳細的使用教程攻略,接下來就是小編為用戶帶來的得物多功能使用教學匯總,有興趣的用戶快來一起看看吧!得物使用教學【2024-03-20】得物分期購怎麼使用【2024-03-20】得物優惠券怎麼獲得【2024-03-20】得物人工客服怎麼找【2024-03-20】得物取件碼怎麼查看【2024-03-20】得物求購在哪裡看【2024-03-20】得物vip怎麼開【2024-03-20】得物怎麼申請退換貨

網路易雲音樂怎麼分享到微信朋友圈_網易雲音樂分享到微信朋友圈教程 網路易雲音樂怎麼分享到微信朋友圈_網易雲音樂分享到微信朋友圈教程 Mar 25, 2024 am 11:41 AM

1.首先我們進入到網易雲音樂中,然後在軟體首頁介面中,點選進入到歌曲的播放介面中。 2.然後在歌曲播放介面中,找到右上方的分享功能按鈕,如下圖紅框所示位置,點擊選擇分享的管道;在分享管道中,點擊底部的「分享至」選項,然後選擇第一個“微信朋友圈”,即可將內容分享至微信朋友圈。

夏天,一定要試試拍攝彩虹 夏天,一定要試試拍攝彩虹 Jul 21, 2024 pm 05:16 PM

夏天雨後,常常能見到美麗又神奇的特殊天氣景象-彩虹。這也是攝影中可遇而不可求的難得景象,非常出片。彩虹出現有這樣幾個條件:一是空氣中有充足的水滴,二是太陽以較低的角度照射。所以下午雨過天晴後的一段時間內,是最容易看到彩虹的時候。不過彩虹的形成受天氣、光線等條件的影響較大,因此一般只會持續一小段時間,而最佳觀賞、拍攝時間更為短暫。那麼遇到彩虹,怎樣才能合理地記錄下來並拍出質感呢? 1.尋找彩虹除了上面提到的條件外,彩虹通常出現在陽光照射的方向,即如果太陽由西向東照射,彩虹更有可能出現在東

JUnit框架中註解如何用於測試方法? JUnit框架中註解如何用於測試方法? May 06, 2024 pm 05:33 PM

JUnit框架中的註解用於聲明和配置測試方法,主要註解包括:@Test(聲明測試方法)、@Before(測試方法執行前運行的方法)、@After(測試方法執行後運行的方法)、@ BeforeClass(所有測試方法執行前運行的方法)、@AfterClass(所有測試方法執行後運行的方法),這些註解有助於組織和簡化測試程式碼,並透過提供明確的意圖和配置來提高測試程式碼的可讀性和可維護性。

百度網盤怎麼分享文件給好友 百度網盤怎麼分享文件給好友 Mar 25, 2024 pm 06:52 PM

近期,百度網盤安卓客戶端迎來了全新的8.0.0版本,這個版本不僅帶來了許多變化,還增添了許多實用功能。其中,最引人注目的便是資料夾共享功能的增強。現在,使用者可以輕鬆邀請好友加入,共同分享工作與生活中的重要文件,實現更便利的協作與分享。那麼究竟該如何分享給好友自己需要分享的文件呢,下文中本站小編就會為大家帶來詳細內容介紹,希望能幫助大家! 1)開啟百度雲APP,先點選在首頁選擇相關的資料夾,再點選介面右上角的【...】圖示;(如下圖)2)接著點選「共用成員」一欄中的【+ 】,最後在勾選所

微信關收款聲音的步驟教程 微信關收款聲音的步驟教程 Mar 26, 2024 am 08:30 AM

1.首先打開微信。 2.點選右上角【+】。 3.點選二維碼收款。 4.點擊右上角三個小點。 5.點選關閉收款到帳語音提醒。

Java函數與Kotlin語言函數的差別? Java函數與Kotlin語言函數的差別? Apr 24, 2024 am 08:24 AM

Java和Kotlin函數的區別:語法:Java函數需要明確參數類型和名稱,而Kotlin可以省略類型並使用lambda表達式;參數:Kotlin可以使用更簡潔的語法省略參數類型;返回值:Kotlin可以省略返回值類型,預設為Unit;擴充函數:Kotlin可以為現有類別新增函數,而Java需要透過繼承實作類似功能;實例方法呼叫:Kotlin可以省略物件名,使用更簡潔的語法。

Jackson庫中註解如何控制JSON序列化和反序列化? Jackson庫中註解如何控制JSON序列化和反序列化? May 06, 2024 pm 10:09 PM

Jackson庫中的註解可控制JSON序列化和反序列化:序列化:@JsonIgnore:忽略屬性@JsonProperty:指定名稱@JsonGetter:使用獲取方法@JsonSetter:使用設定方法反序列化:@JsonIgnoreProperties:忽略屬性@ JsonProperty:指定名稱@JsonCreator:使用建構子@JsonDeserialize:自訂邏輯

See all articles