Annotation Use-site Targets
当你标注一个属性类型或构造器参数时,会有很多对应于Kotlin元素的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
同样的语法可以用在标注整个文件上。只需要将注解放置在文件的最顶级,在包的声明或导入文件声明之前:
@file:JvmName("Foo")
package org.jetbrains.demo
如果你有多个注解标注同一个对象,你可以使用方括号来避免重复的标注,并把所有的注解都放置在方括号中:
class Example {
@set:[Inject VisibleForTesting]
var collaborator: Collaborator
}
支持的所有的use-site注解如下:
- file
- property(这个注解对Java来说不可见)
- field
- get(getter)
- set(setter)
- receiver(扩展函数或属性的接收者参数)
- param(构造器参数)
- setparam(setter的参数)
- delegate(存储委派属性的委派实例的属性)
为了标注扩展函数的接收器参数,使用下面的语法:
fun @receiver:Fancy String.myExtension() { }
如果你不想指定一个use-site目标,那么目标就会根据@Target注解来选择。如果有很多可用选项,以下列表的第一个可用的选项将会被使用:
- param
- property
- field