Your Site Title

kotlin annotations

// 声明注解
annotation class Fancy

使用meta-annotations可以指定注解的属性:

Constructors

注解可以有构造函数

annotation class Special(val why: String)

@Special("example") class Foo {}

构造函数允许的参数类型:

构造函数参数不允许nullable类型. 因为JVM不支持存储null值到注解属性. 使用其它注解当参数时, 名称不需要使用@ 使用类当参数时使用KClass, kotlin编译器会自动转换成Java code

Instantiation

在Java中注解实现是接口, 所以可以实现注解并创建对象 在kotlin中, 为了和java一致, 所以允许调用注解的构造函数实例化注解对象.

Lambdas

注解可以修饰lambdas, 编译后会放在lambdas的invoke()方法上. 运行时可反射. 对类似与Quasar框架非常有用.

annotation use-site targets

指定注解生成对应Java 字节码对应的位置.

class Example(@field:Ann val foo,    // annotate Java field
          @get:Ann val bar,      // annotate Java getter
          @param:Ann val quux)   // annotate Java constructor parameter

支持的use-site targets:

Java annotations

kotlin100%支持java注解 需要使用命名参数调用java注解, 因为没有定义调用顺序. 例外的是value

Arrays as annotation parameters

Java注解定义数组, kotlin中使用vararg kotlin中使用array literal syntaxarrayOf(...)

Acessing properties of an annotation instance

// Java
public @interface Ann {
    int value();
}

// Kotlin
fun foo(ann: Ann) {
    val i = ann.value
}

Repeatable annotations

与java一样, kotlin注解可以重复多次使用在同一个元素上 Kotlin会生成@Tag.Container

@Repeatable
annotation class Tag(val name: String)

// The compiler generates the @Tag.Container containing annotation

使用JvmRepeatable自定义包含注解的名称

@JvmRepeatable(Tags::class)
annotation class Tag(val name: String)

annotation class Tags(val value: Array<Tag>)

Reference