在Kotlin中的声明注解的方式和Java稍微不一样,在Java中主要是通过 @interface关键字来声明,而在Kotlin中只需要通过 annotation class 来声明。
Java注解的声明
//Java中的注解通过@interface关键字进行定义,它和接口声明类似,只不过在前面多加@
@interface ApiDoc {
String value();
}
Kotlin注解的声明
//和一般的声明很类似,只是在class前面加上了annotation修饰符
annotation class ApiDoc(val value: String)
在Kotlin中使用注解和Java一样:
@ApiDoc(“修饰类”)
class Box {
@ApiDoc(“修饰字段”)
val size = 6
@ApiDoc(“修饰方法”)
fun test() {
}
}
和Java一样在Kotlin中一个Kotlin注解类自己本身也可以被注解,可以给注解类加注解,我们把这种注解称为元注解。
Kotlin中的元注解类定义于kotlin.annotation包中,主要有:
4种元注解,相比Java中5种元注解少了@Inherited,在这里四种元注解中最常用的是前两种,接下来我们就来重点分析下前两种元注解:
@Target顾名思义就是目标对象,也就是我们定义的注解能够应用于那些目标对象,可以同时指定多个作用的目标对象。
@Target(AnnotationTarget.ANNOTATION_CLASS)//可以给标签自己贴标签
@MustBeDocumented
public annotation class Target(vararg val allowedTargets: AnnotationTarget)
从@Target的原型中我们可以看出,它接受一个vararg可变数量的参数,所以可以同时指定多个作用的目标对象,并且参数类型限定为AnnotationTarget。
在@Target注解中可以同时指定一个或多个目标对象,那么到底有哪些目标对象呢?接下来让我们一起走进AnnotationTarget枚举类的源码:
AnnotationTarget
public enum class AnnotationTarget {
CLASS, //表示作用对象有类、接口、object对象表达式、注解类
ANNOTATION_CLASS,//表示作用对象只有注解类
TYPE_PARAMETER,//表示作用对象是泛型类型参数(暂时还不支持)
PROPERTY,//表示作用对象是属性
FIELD,//表示作用对象是字段,包括属性的幕后
字段
LOCAL_VARIABLE,//表示作用对象是局部变量
VALUE_PARAMETER,//表示作用对象是函数或构造函数的参数
CONSTRUCTOR,//表示作用对象是构造函数,主构造函数或次构造函数
FUNCTION,//表示作用对象是函数,不包括构造函数
PROPERTY_GETTER,//表示作用对象是属性的getter函数
PROPERTY_SETTER,//表示作用对象是属性的setter函数
TYPE,//表示作用对象是一个类型,比如类、接口、枚举
EXPRESSION,//表示作用对象是一个表达式
FILE,//表示作用对象是一个File
@SinceKotlin(“1.1”)
TYPEALIAS//表示作用对象是一个类型别名
}
一旦注解被限定了@Target那么它只能被应用于限定的目标对象上,为了验证这一说法,我们为ApiDoc限定下目标对象:
@Target(AnnotationTarget.CLASS)
annotation class ApiDoc(val value: String)
@ApiDoc(“修饰类”)
class Box {
@ApiDoc(“修饰字段”)
val size = 6
@ApiDoc(“修饰方法”)
fun test() {
}
}
这样一来ApiDoc注解只能被应用于类上,如果将它应用在方法或字段上则会抛出异常:
This annotation is not applicable to target ‘member property with backing field’
@Retention
我们可以理解为保留期,和Java一样Kotlin有三种时期:
我们可以理解为保留期,和Java一样Kotlin有三种时期: