我爱编程

Kotlin 注解

2018-06-13  本文已影响0人  Wavky

元注解

@Retention 保留期

@Target 作用域

定义该注解可使用的领域

@MustBeDocumented

将注解中的元素包含到 Javadoc 中去。

@Repeatable

该注解允许复数应用到同一目标(通过提供不同注解参数区分)

AbstractProcessor 注解处理器

派生该处理器子类,复写以下方法:

※ 使用 AutoService 将注解处理器注册到META-INF元数据中

@AutoService(Processor::class)
class MyProcessor: AbstractProcessor() {

    override fun getSupportedAnnotationTypes(): MutableSet<String> {
        return mutableSetOf(MyAnnotation::class.java.name)
    }

    override fun getSupportedSourceVersion(): SourceVersion {
        return SourceVersion.latest()
    }

    override fun process(set: MutableSet<out TypeElement>,
                         roundEnv: RoundEnvironment): Boolean {
        roundEnv.getElementsAnnotatedWith(GenName::class.java)
                .forEach {
                    val className = it.simpleName.toString()
                    val pack = processingEnv.elementUtils.getPackageOf(it).toString()
                    // else
                }
        return true
    }
}

自定义注解

定义

注解支持的参数类型:

@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
        AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class Fancy

使用

// 一般用法
@Fancy class Foo {
    @Fancy fun baz(@Fancy foo: Int): Int {
        return (@Fancy 1)
    }
}

// 构造函数
class Foo @Inject constructor(dependency: MyDependency) {
}

// 属性setter
class Foo {
    var x: MyDependency? = null
        @Inject set
}

// Lambda表达式
val f = @Suspendable { Fiber.sleep(10) }

指定注解作用域

在使用注解时,可显式指定该注解的作用范围。

对PROPERTY属性或构造函数参数使用注解时,可显式指定其作用域:

class Example(@field:Ann val foo,    // 标注 Java 字段
              @get:Ann val bar,      // 标注 Java getter
              @param:Ann val quux)   // 标注 Java 构造函数参数

对整个文件进行注解:

@file:JvmName("Foo")

package org.jetbrains.demo

同一目标多重注解时,使用数组式声明:

class Example {
     @set:[Inject VisibleForTesting]
     var collaborator: Collaborator
}

不指定作用域时,根据注解定义的Target选择应用目标。当存在多个可应用目标时,适配以下第一个合适的对象:

  1. param
  2. property
  3. field

参考文档:

Hello World of Annotation Processing in Kotlin
Kotlin注解文档

上一篇 下一篇

猜你喜欢

热点阅读