13-注解使用场景目标
10.2.4 注解使用场景目标
把注解应用在属性或主构造方法的参数中时,Kotlin的注解可以转换成相对应的Java的注解,并且在生成Java字节码的过程中,注解可能还有很多不同的应用场景。如果要精确地指定对应的注解生成,需要参照以下规则。
class Example(@field:Ann val foo, //标注Java字段
@get:Ann val bar, //标注Java getter
@param:Ann val quux) //标注Java构造函数参数
在这当中,标注@field、@get和@param都是Java的注解。当然,也可以使用相同的语法来标注整个文件,为了达到这个目的,只需要把带有目标file的注解放在文件的顶层,即放在包名和所有import语句之前。代码如下。
@file:JvmName("Foo")
package org.jetbrains.demo
如果在一个目标文件中出现多个注解,为了避免重复添加,可以在目标后面添加方括号,并把所有注解都放在方括号里面。
class Example {
@set:[Inject VisibleForTesting] //多个注解
var collaborator: Collaborator
}
如果要标注扩展函数的接收者参数,可以使用以下语法。
fun @receiver:Fancy String.myExtension() { }
除了上面介绍的注解目标之外,Kotlin注解支持的使用场景目标(use-site target)标注主要有以下几种。
- file:文件目标注解。
- property:此目标注解对Java不可见。
- field:自动返回字段。
- get:属性getter。
- set:属性setter。
- receiver:拓展函数或属性的接收者参数。
- param:构造函数参数。
- setparam:属性 setter 参数。
- delegate:存储在委托属性中的委托实例属性。
如果没有指定使用场景目标,则根据正在使用的@Target注解来选择目标;如果有多个可用目标,则使用param、property和field中的一个作为第一个适用目标。