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
Zusätzliche Eigenschaften der Annotation können angegeben werden, indem Sie die Annotationsklasse mit einem Meta- annotieren. Annotation:
@Target gibt die möglichen Arten von Elementen an, die mit dieser Annotation annotiert werden können (Klasse, Funktion, Attribut, Ausdruck usw.); >
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.@ 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) } }
class Foo @Inject constructor(dependency: MyDependency) { // …… }
Konstruktor
class Foo { var x: MyDependency? = null @Inject set }
Die zulässigen Parametertypen sind:
annotation class Special(val why: String) @Special("example") class Foo {}
Typen, die nativen Java-Typen entsprechen (Int, Long usw.) .);
String
-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"))
import kotlin.reflect.KClass annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>) @Ann(String::class, Int::class) class MyClass
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) }
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 🎜>
class Example(@field:Ann val foo, // 标注 Java 字段 @get:Ann val bar, // 标注 Java getter @param:Ann val quux) // 标注 Java 构造函数参数
Eigenschaft (mit Anmerkung für dieses Ziel, unsichtbar für Java)
@file:JvmName("Foo") package org.jetbrains.demo
class Example { @set:[Inject VisibleForTesting] var collaborator: Collaborator }
Zum Kommentieren des Empfängerparameters von Als Erweiterungsfunktion verwenden Sie die folgende Syntax:
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 }
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!