当前位置:嗨网首页>书籍在线阅读

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")
}