この記事では主にKotlinのアノテーションクラスの詳細と例に関する関連情報を紹介します
Kotlinのアノテーションクラスの詳細と例を参照してください
アノテーションステートメント
アノテーションとは、コードメソッドにメタデータを追加することです。アノテーションを宣言するには、クラスの前にアノテーション修飾子を配置します:
annotation class Fancy
アノテーションの追加プロパティは、アノテーション クラスにメタアノテーションを付けることで指定できます:
@Target は、次の要素を指定します。このアノテーションでアノテーションが付けられます。 可能なタイプ (クラス、関数、属性、式など)。
@Retention は、アノテーションがコンパイルされたクラス ファイルに保存されるかどうか、および実行時にリフレクションを通じて表示できるかどうかを指定します。 (デフォルトは両方とも true);
@Repeatable は、同じアノテーションを 1 つの要素で複数回使用することを許可します。は、生成された API ドキュメントのクラスまたはメソッドの署名に含める必要があります ( を参照)。
(AnnotationRetention.SOURCE) @MustBeDocumented
注釈クラス Fancy
使用法
@Fancy class Foo { @Fancy fun baz(@Fancy foo: Int): Int { return (@Fancy 1) } }
class Foo @Inject constructor(dependency: MyDependency) { // …… }
class Foo { var x: MyDependency? = null @Inject set }
Constructor
注釈には、パラメーターを受け入れるコンストラクターを含めることができます。
annotation class Special(val why: String) @Special("example") class Foo {}
: : class
);アノテーションが別のアノテーションのパラメーターとして使用される場合、その名前には @ 文字が接頭辞として付けられません:
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"))
import kotlin.reflect.KClass annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>) @Ann(String::class, Int::class) class MyClass
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 构造函数参数
同じ構文を使用して、ファイル全体に注釈を付けることができます。 これを行うには、ファイルの最上位、パッケージ ディレクティブの前、またはすべてのインポートの前 (ファイルがデフォルト パッケージにある場合) に、ターゲット ファイルを含む注釈を配置します。同じターゲットの注釈を使用する場合は、ターゲットの後に角括弧を追加し、すべての注釈を角括弧内に配置することで、ターゲットの重複を避けることができます。 (このターゲットのアノテーションは Java には表示されません)
field
set (プロパティセッター)
param (コンストラクターパラメーター)
拡張関数 Or パラメーターの受信をマークするためでは、次の構文を使用してください:
@file:JvmName("Foo") package org.jetbrains.demo
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 中国語 Web サイトの他の関連記事を参照してください。