11-注解使用
10.2.2 注解使用
注解可以声明在类、方法、局部变量和方法参数等的前面,用来对这些元素进行注释说明。
annotation class FancyClass
@FancyClass class Foo {
@FancyClass fun baz(@Fancy foo: Int): Int {
return (1)
}
}
如果需要给类的主构造函数添加注解,则必须在主构造函数的声明中添加关键字constructor,并将注解添加到关键字前面。
class Foo @FancyClass constructor(n: Int) {
// ……
}
需要注意的是,如果直接将注解类FancyClass应用于Foo类的主构造函数中,代码是会报错的,因为该注解类没有指定对应的类构造器。因此,需要在FancyClass类中添加AnnotationTarget. CONSTRUCTOR注解声明。
@Target(AnnotationTarget.CONSTRUCTOR)
annotation class FancyClass
同时,Kotlin也允许对属性的访问器添加注解,不过需要给注解类的属性添加相应的get和set方法。代码如下。
@Target(AnnotationTarget.CONSTRUCTOR,AnnotationTarget.PROPERTY_GETTER,AnnotationTarget.PROPERTY_SETTER)
annotation class FancyClass
class Foo @FancyClass constructor(n: Int) {
class Foo{
var x:Int?=null
@FancyClass get
@FancyClass set
}
}
在上面的实例中,为注解类FancyClass添加的两个Target元注解的含义如下。
- AnnotationTarget.PROPERTY_GETTER:用于表示属性的get方法。
- AnnotationTarget.PROPERTY_SETTER:用于表示属性的set方法。
当然,Kotlin还允许直接为属性添加注解,不过,需要在注解类FancyClass中添加AnnotationTarget. PROPERTY注解声明。代码如下。
@Target(AnnotationTarget.PROPERTY)
annotation class FancyClass
class Foo{
@FancyClass var x:Int?=null
}
注解还可以用在Lambda表达式上。当在Lambda表达式中使用注解时,注解会被添加到Lambda表达式的生成invoke方法上。
annotation class Suspendable
val f = @Suspendable {
println("hello")
}