>  기사  >  Java  >  Kotlin 주석 클래스 예시 튜토리얼 공유

Kotlin 주석 클래스 예시 튜토리얼 공유

零下一度
零下一度원래의
2017-06-17 11:54:551530검색

이 글에서는 주로 Kotlin의 Annotation 클래스 세부 사항 및 예제에 대한 관련 정보를 소개합니다. 필요한 친구는

Kotlin의 Annotation 클래스 세부 사항 및 예제

Annotation 문

Annotation은 코드 메서드에 메타데이터를 추가하는 것입니다. 주석을 선언하려면 클래스 앞에 주석 수정자를 배치합니다.


annotation class Fancy

주석의 추가 속성은 주석 클래스에 메타 주석을 추가하여 지정할 수 있습니다.

  1. @Target은 다음과 같은 요소를 지정합니다. 이 주석으로 주석을 달 수 있습니다. 가능한 유형(클래스, 함수, 속성, expression 등)

  2. @Retention은 주석이 컴파일된 클래스 파일에 저장되는지 여부와 리플렉션을 통해 표시될 수 있는지 여부를 지정합니다. 런타임(기본값은 둘 다 true)

  3. @Repeatable을 사용하면 단일 요소에서 동일한 주석을 여러 번 사용할 수 있습니다.

  4. @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 {}
re는 다음과 같습니다. class

);


열거형;

  1. 위에 나열된 유형의 배열.

  2. JVM은 주석 속성 값으로 null 저장을 지원하지 않으므로 주석 매개변수는 null 허용 유형을 가질 수 없습니다. 주석이 다른 주석의 매개변수로 사용되는 경우 이름 앞에 @ 문자가 붙지 않습니다.

  3. 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 클래스로 변환합니다.

  4. import kotlin.reflect.KClass
    
    annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>)
    
    @Ann(String::class, Int::class) class MyClass

    람다 표현식
  5. 주석은 람다 표현식에도 사용할 수 있습니다. 이는 람다 식 본문을 생성하는 호출() 메서드에 적용됩니다. 이는 동시성 제어를 위해 주석을 사용하는 Quasar와 같은 프레임워크에 유용합니다.

  6. 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

get(속성 getter)


set(속성 설정자)


receiver(확장 함수나 속성 또는 매개변수의 수신자)

  1. param(생성자 매개변수)

  2. setparam(속성 설정자 매개변수)

  3. delegate(대리자 속성에 대한 위임 인스턴스를 저장하는 필드)

  4. 확장 함수 또는 매개변수의 수신을 표시합니다. , 다음 구문을 사용하십시오.

  5. fun @receiver:Fancy String.myExtension() { }

    대상을 지정하지 않으면 사용 중인 주석의 @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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.