Heim > Java > javaLernprogramm > Teilen eines Beispiel-Tutorials für die Kotlin-Annotationsklasse

Teilen eines Beispiel-Tutorials für die Kotlin-Annotationsklasse

零下一度
Freigeben: 2017-06-17 11:54:55
Original
1600 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die detaillierten Erklärungen und Beispiele der Annotationsklassen von Kotlin vor. Freunde, die sie benötigen, können auf

Kotlins detaillierte Erklärungen und Beispiele der Annotationsklassen

verweisen Anmerkungsdeklaration

Anmerkungen sind eine Möglichkeit, Metadaten an Ihren Code anzuhängen. Um eine Annotation zu deklarieren, platzieren Sie den Annotation-Modifikator vor der Klasse:


annotation class Fancy
Nach dem Login kopieren

Zusätzliche Eigenschaften der Annotation können angegeben werden, indem Sie die Annotationsklasse mit einem Meta- annotieren. Annotation:

  1. @Target gibt die möglichen Arten von Elementen an, die mit dieser Annotation annotiert werden können (Klasse, Funktion, Attribut, Ausdruck usw.); >

  2. @Retention gibt an, ob die Anmerkung in der kompilierten Klassendatei gespeichert wird und ob sie durch Reflektion zur Laufzeit sichtbar sein kann (der Standardwert ist true); 🎜>@Repeatable Ermöglicht die mehrfache Verwendung derselben Annotation für ein einzelnes Element.

  3. @MustBe

    Document

    ed gibt an, dass die Annotation Teil der öffentlichen API ist und sollte in der generierten Signatur der Klasse oder Methode enthalten sein, wie in der API-Dokumentation gezeigt.

  4. @Target

    (AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
  5.                   AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)

@ Aufbewahrung(AnnotationRetention.SOURCE)
@MustBeDocumented

Annotationsklasse Fancy

Verwendung

Wenn Sie den Haupt-

Konstruktor
der Klasse mit Anmerkungen versehen müssen, müssen Sie das Schlüsselwort „constructor“ im Konstruktor hinzufügen Deklaration und fügen Sie davor die Anmerkung hinzu:

@Fancy class Foo {
  @Fancy fun baz(@Fancy foo: Int): Int {
    return (@Fancy 1)
  }
}
Nach dem Login kopieren

Sie können den Eigenschaftsaccessor auch mit Anmerkungen versehen:


class Foo @Inject constructor(dependency: MyDependency) {
  // ……
}
Nach dem Login kopieren

Konstruktor

class Foo {
  var x: MyDependency? = null
    @Inject set
}
Nach dem Login kopieren
Annotation kann einen Konstruktor haben, der Parameter akzeptiert.

Die zulässigen Parametertypen sind:


annotation class Special(val why: String)

@Special("example") class Foo {}
Nach dem Login kopieren

Typen, die nativen Java-Typen entsprechen (Int, Long usw.) .);

  1. String

  2. Enum; Anmerkungen;

  3. Array der oben aufgeführten Typen.
  4. Annotationsparameter können keine nullbaren Typen haben, da die JVM das Speichern von Null als Wert von Annotationseigenschaften nicht unterstützt.
  5. Wenn eine Annotation als Parameter einer anderen Annotation verwendet wird, wird ihrem Namen kein @-Zeichen vorangestellt:

  6. Wenn eine Klasse dies benötigt Anzugebende Parameter: Verwenden Sie für annotierte Parameter Kotlin-Klassen (KClass). Der Kotlin-Compiler konvertiert es automatisch in eine Java-Klasse, sodass Java-Code die Annotation und Parameter normal sehen kann.

Lambda-Ausdrücke Die

-Annotation kann auch für Lambda-Ausdrücke verwendet werden. Sie werden auf die invoke()-Methode angewendet, die den Lambda-Ausdruckskörper generiert. Dies ist nützlich für Frameworks wie Quasar, die Annotationen zur Parallelitätskontrolle verwenden.


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"))
Nach dem Login kopieren

Annotationsverwendungsziel


Beim Annotieren von Eigenschaften oder Hauptkonstruktor-
import kotlin.reflect.KClass

annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>)

@Ann(String::class, Int::class) class MyClass
Nach dem Login kopieren
Funktionsparametern

wird dies der Fall sein Da es sich um mehrere Java-Elemente handelt, die aus dem entsprechenden Kotlin-Element generiert wurden, gibt es mehrere mögliche Positionen für diese Annotation im generierten Java-Bytecode. Wenn Sie genau angeben möchten, wie die Anmerkung generiert werden soll, verwenden Sie die folgende Syntax:


Sie können dieselbe Syntax verwenden, um die gesamte Datei mit Anmerkungen zu versehen . Platzieren Sie dazu die Annotation mit der Zieldatei auf der obersten Ebene der Datei, vor der Paketanweisung oder vor allen Importen (wenn sich die Datei im Standardpaket befindet):

annotation class Suspendable

val f = @Suspendable { Fiber.sleep(10) }
Nach dem Login kopieren

Wenn Sie mehrere Anmerkungen für dasselbe Ziel haben, können Sie doppelte Ziele vermeiden, indem Sie nach dem Ziel eckige Klammern hinzufügen und alle Anmerkungen in die Klammern einfügen:

< Die vollständige Liste von Unterstützte Nutzungsziele für 🎜>

sind:


class Example(@field:Ann val foo,  // 标注 Java 字段
       @get:Ann val bar,   // 标注 Java getter
       @param:Ann val quux)  // 标注 Java 构造函数参数
Nach dem Login kopieren
Datei


Eigenschaft (mit Anmerkung für dieses Ziel, unsichtbar für Java)

@file:JvmName("Foo")

package org.jetbrains.demo
Nach dem Login kopieren

field


class Example {
   @set:[Inject VisibleForTesting]
   var collaborator: Collaborator
}
Nach dem Login kopieren
get (property getter)

  1. set (property setter)

  2. receiver (Empfängerparameter der Erweiterungsfunktion oder -eigenschaft)

  3. param (Konstruktorparameter)

  4. setparam ( Eigenschaftssetter-Parameter)

  5. delegate (Feld für eine Delegateneigenschaft zum Speichern ihrer Delegateninstanz)

  6. Zum Kommentieren des Empfängerparameters von Als Erweiterungsfunktion verwenden Sie die folgende Syntax:

  7. Wenn Sie kein Ziel angeben, basiert es auf der @Target-Annotation der verwendeten Annotation Ihr Ziel. Wenn mehrere anwendbare Ziele vorhanden sind, wird das erste anwendbare Ziel aus der folgenden Liste verwendet:
    • 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())
      }
    }
    Nach dem Login kopieren

    因为 Java 编写的注解没有定义参数顺序,所以不能使用常规函数调用 语法来传递参数。相反,你需要使用命名参数语法。


    // Java
    public @interface Ann {
      int intValue();
      String stringValue();
    }
    // Kotlin
    @Ann(intValue = 1, stringValue = "abc") class C
    Nach dem Login kopieren

    就像在 Java 中一样,一个特殊的情况是 value 参数;它的值无需显式名称指定。


    // Java
    public @interface AnnWithValue {
      String value();
    }
    // Kotlin
    @AnnWithValue("abc") class C
    Nach dem Login kopieren

    如果 Java 中的 value 参数具有数组类型,它会成为 Kotlin 中的一个 vararg 参数:


    // Java
    public @interface AnnWithArrayValue {
      String[] value();
    }
    // Kotlin
    @AnnWithArrayValue("abc", "foo", "bar") class C
    Nach dem Login kopieren

    对于具有数组类型的其他参数,你需要显式使用 arrayOf:


    // Java
    public @interface AnnWithArrayMethod {
      String[] names();
    }
    // Kotlin
    @AnnWithArrayMethod(names = arrayOf("abc", "foo", "bar")) class C
    Nach dem Login kopieren

    注解实例的值会作为属性暴露给 Kotlin 代码。


    // Java
    public @interface Ann {
      int value();
    }
    // Kotlin
    fun foo(ann: Ann) {
      val i = ann.value
    }
    Nach dem Login kopieren

    Das obige ist der detaillierte Inhalt vonTeilen eines Beispiel-Tutorials für die Kotlin-Annotationsklasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage