Cet article présente principalement l'explication détaillée et les exemples des classes d'annotation de Kotlin. Les amis qui en ont besoin peuvent se référer aux
Explications détaillées de Kotlin et exemples de classes d'annotation
. Déclaration d'annotation
Les annotations sont un moyen d'attacher des métadonnées à votre code. Pour déclarer une annotation, placez le modificateur d'annotation devant la classe :
annotation class Fancy
Des propriétés supplémentaires de l'annotation peuvent être spécifiées en annotant la classe d'annotation avec une méta- annotation :
@Target précise les types possibles d'éléments pouvant être annotés avec cette annotation (classe, fonction, attribut, expression, <🎜) ; >
ed précise que l'annotation fait partie de l'API publique ; et doit être inclus dans la signature In générée de la classe ou de la méthode, comme indiqué dans la documentation de l'API.
(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@ Rétention
(AnnotationRetention.SOURCE)@MustBeDocumented
@Fancy class Foo { @Fancy fun baz(@Fancy foo: Int): Int { return (@Fancy 1) } }
de la classe, vous devez ajouter le mot-clé constructor dans le constructeur déclaration , et ajoutez l'annotation devant :
class Foo @Inject constructor(dependency: MyDependency) { // …… }
class Foo { var x: MyDependency? = null @Inject set }
L'annotation peut avoir un constructeur qui accepte des paramètres.
annotation class Special(val why: String) @Special("example") class Foo {}
Tableau des types répertoriés ci-dessus.
Si une classe a besoin à préciser Pour les paramètres annotés, utilisez les classes Kotlin (KClass). Le compilateur Kotlin le convertira automatiquement en classe Java afin que le code Java puisse voir normalement l'annotation et les paramètres.
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"))
peut également être utilisée pour les expressions lambda. Ils sont appliqués à la méthode Invoke() qui génère le corps de l'expression lambda. Ceci est utile pour les frameworks comme Quasar, qui utilisent des annotations pour le contrôle de concurrence.
import kotlin.reflect.KClass annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>) @Ann(String::class, Int::class) class MyClass
Cible d'utilisation de l'annotation
Lors de l'annotation de propriétés ou de
paramètres de fonction
annotation class Suspendable val f = @Suspendable { Fiber.sleep(10) }
class Example(@field:Ann val foo, // 标注 Java 字段 @get:Ann val bar, // 标注 Java getter @param:Ann val quux) // 标注 Java 构造函数参数
sont :
@file:JvmName("Foo") package org.jetbrains.demo
class Example { @set:[Inject VisibleForTesting] var collaborator: Collaborator }
Pour annoter le paramètre de récepteur de une fonction d'extension, utilisez la syntaxe suivante :
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 }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!