이 글에서는 주로 Kotlin의 Annotation 클래스 세부 사항 및 예제에 대한 관련 정보를 소개합니다. 필요한 친구는
Kotlin의 Annotation 클래스 세부 사항 및 예제
Annotation 문
Annotation은 코드 메서드에 메타데이터를 추가하는 것입니다. 주석을 선언하려면 클래스 앞에 주석 수정자를 배치합니다.
annotation class Fancy
주석의 추가 속성은 주석 클래스에 메타 주석을 추가하여 지정할 수 있습니다.
@Target은 다음과 같은 요소를 지정합니다. 이 주석으로 주석을 달 수 있습니다. 가능한 유형(클래스, 함수, 속성, expression 등)
@Retention은 주석이 컴파일된 클래스 파일에 저장되는지 여부와 리플렉션을 통해 표시될 수 있는지 여부를 지정합니다. 런타임(기본값은 둘 다 true)
@Repeatable을 사용하면 단일 요소에서 동일한 주석을 여러 번 사용할 수 있습니다.
@MustBeDocumented는 주석이 공개 API의 일부임을 지정합니다. 에 표시된 클래스 또는 메서드의 서명에 생성된 API 문서에 포함되어야 합니다.
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE )
@MustBeDocumented
주석 수업 Fancy
Usage
@Fancy class Foo { @Fancy fun baz(@Fancy foo: Int): Int { return (@Fancy 1) } }
클래스의 기본 constructor에 주석을 달아야 하는 경우 생성자 선언에 생성자 키워드를 추가하고 그 앞에 주석을 추가해야 합니다.
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 {}
열거형;
JVM은 주석 속성 값으로 null 저장을 지원하지 않으므로 주석 매개변수는 null 허용 유형을 가질 수 없습니다. 주석이 다른 주석의 매개변수로 사용되는 경우 이름 앞에 @ 문자가 붙지 않습니다.
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
주석은 람다 표현식에도 사용할 수 있습니다. 이는 람다 식 본문을 생성하는 호출() 메서드에 적용됩니다. 이는 동시성 제어를 위해 주석을 사용하는 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 构造函数参数
@file:JvmName("Foo") package org.jetbrains.demo
class Example { @set:[Inject VisibleForTesting] var collaborator: Collaborator }
지원되는 사용 대상의 전체 목록은 다음과 같습니다.
file
property (이 대상이 있는 주석은 Java에 표시되지 않습니다.)
field
set(속성 설정자)
확장 함수 또는 매개변수의 수신을 표시합니다. , 다음 구문을 사용하십시오.
fun @receiver:Fancy String.myExtension() { }
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!