Kotlin アノテーション クラスのサンプル チュートリアルの共有

零下一度
リリース: 2017-06-17 11:54:55
オリジナル
1570 人が閲覧しました

この記事では主にKotlinのアノテーションクラスの詳細と例に関する関連情報を紹介します

Kotlinのアノテーションクラスの詳細と例を参照してください

アノテーションステートメント

アノテーションとは、コードメソッドにメタデータを追加することです。アノテーションを宣言するには、クラスの前にアノテーション修飾子を配置します:


annotation class Fancy
ログイン後にコピー

アノテーションの追加プロパティは、アノテーション クラスにメタアノテーションを付けることで指定できます:

  1. @Target は、次の要素を指定します。このアノテーションでアノテーションが付けられます。 可能なタイプ (クラス、関数、属性、など)。

  2. @Retention は、アノテーションがコンパイルされたクラス ファイルに保存されるかどうか、および実行時にリフレクションを通じて表示できるかどうかを指定します。 (デフォルトは両方とも true);

  3. @Repeatable は、同じアノテーションを 1 つの要素で複数回使用することを許可します。は、生成された API ドキュメントのクラスまたはメソッドの署名に含める必要があります ( を参照)。

  4. @Target
    (AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,

    AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention

(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 {}
ログイン後にコピー

許可されるパラメータの型は次のとおりです:


Java ネイティブ型 (Int、Long など) に対応する型


  1. Class (Foo

    : : class

    );
  2. 列挙;

  3. 上記の型の配列。

  4. JVM は注釈属性の値として null を格納することをサポートしていないため、注釈パラメーターは null 許容型を持つことができません。
  5. アノテーションが別のアノテーションのパラメーターとして使用される場合、その名前には @ 文字が接頭辞として付けられません:

  6. 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 コードは注釈とパラメーターを正常に認識できます。

  7. import kotlin.reflect.KClass
    
    annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>)
    
    @Ann(String::class, Int::class) class MyClass
    ログイン後にコピー

  8. ラムダ式

アノテーションはラムダ式にも使用できます。これらは、ラムダ式本体を生成する 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 构造函数参数
ログイン後にコピー

同じ構文を使用して、ファイル全体に注釈を付けることができます。 これを行うには、ファイルの最上位、パッケージ ディレクティブの前、またはすべてのインポートの前 (ファイルがデフォルト パッケージにある場合) に、ターゲット ファイルを含む注釈を配置します。同じターゲットの注釈を使用する場合は、ターゲットの後に角括弧を追加し、すべての注釈を角括弧内に配置することで、ターゲットの重複を避けることができます。 (このターゲットのアノテーションは Java には表示されません)

field

get (プロパティゲッター)

set (プロパティセッター)

receiver (拡張関数、プロパティ、またはパラメーターのレシーバー)


param (コンストラクターパラメーター)


setparam (プロパティセッターパラメーター)

  1. delegate (デリゲートプロパティのデリゲートインスタンスを保存するフィールド)

  2. 拡張関数 Or パラメーターの受信をマークするためでは、次の構文を使用してください:

  3. @file:JvmName("Foo")
    
    package org.jetbrains.demo
    ログイン後にコピー

    ターゲットを指定しない場合、ターゲットは使用されているアノテーションの @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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート