Kotlin 注解全解析

类比思维是非常实用的思维方式,我们跟Java的注解进行对比,就可以快速理解Kotlin的注解。

Java 代码:

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import org.springframework.stereotype.Component;


@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface DomainAbilityProvider {

/**

    * 领域

    *

    * @return 领域

    */

    DomainEnum domain();

/**

    * 能力提供方

    *

    * @return 能力提供方

    */

    String provider();

}

Kotlin代码:

对应到 Kotlin 的注解里就是:

package com.lightsword.da

import org.springframework.stereotype.Component

/**

* @author: Jack

* 2021/3/16 上午11:18

*

* 1.Kotlin中的元注解类定义于kotlin.annotation包中,主要有: @Target、@Retention、@Repeatable、@MustBeDocumented 4种元注解

* 2.相比Java中5种元注解: @Target、@Retention、@Repeatable、@Documented、@Inherited少了 @Inherited元注解。

* 3.注解类中只能拥有如下类型的参数: 基本数据类型、字符串、枚举、类引用类型、其他的注解类(例如Deprecated注解类中的ReplaceWith注解类)

*/

@Target(AnnotationTarget.TYPE)

@Retention(AnnotationRetention.RUNTIME)

@MustBeDocumented

@Component

annotation class DomainAbilityProvider(

/**

    * 领域

    */

    val domain:DomainEnum,

/**

    * 能力提供方

    */

    val provider:String

)



元编程:关于编程中的注解

一、注解的本质

注解实际上就是一种代码标签,它作用的对象是代码。它可以给特定的注解代码标注一些额外的信息。然而这些信息可以选择不同保留时期,比如源码期、编译期、运行期。然后在不同时期,可以通过某种方式获取标签的信息来处理实际的代码逻辑,这种方式常常就是我们所说的反射

二、注解的定义

在Kotlin中注解核心概念和Java一样,注解就是为了给代码提供元数据。并且注解是不直接影响代码的执行。一个注解允许你把额外的元数据关联到一个声明上,然后元数据就可以被某种方式(比如运行时反射方式以及一些源代码工具)访问

三、注解的声明(标签的声明)

在Kotlin中的声明注解的方式和Java稍微不一样,在Java中主要是通过@interface关键字来声明,而在Kotlin中只需要通过annotation class来声明, 需要注意的是在Kotlin中编译器禁止为注解类指定类主体,因为在Kotlin中注解只是用来定义关联的声明和表达式的元数据的结构。

1、Kotlin注解声明

package com.mikyou.annotation

//和一般的声明很类似,只是在class前面加上了annotation修饰符 

annotation class TestAnnotation(val value:String)

2、Java注解声明

package com.mikyou.annotation;

//java中的注解通过@interface关键字进行定义,它和接口声明类似

public @interface TestAnnotation{

String value();

}


Kotlin中的元注解

和Java一样在Kotlin中,一个Kotlin注解类自己本身也可以被注解,可以给注解类加注解。我们把这种注解称为元注解,可以把它理解为一种基本的注解,可以把它理解为一种特殊的标签,用于标注标签的标签。

Kotlin中的元注解类定义于kotlin.annotation包中,主要有: @Target、@Retention、@Repeatable、@MustBeDocumented 4种元注解相比Java中5种元注解: @Target、@Retention、@Repeatable、@Documented、@Inherited少了 @Inherited元注解。

@Target元注解

1、介绍

Target顾名思义就是目标对象,也就是这个标签作用于哪些代码中目标对象,可以同时指定多个作用的目标对象。

2、源码定义

@Target(AnnotationTarget.ANNOTATION_CLASS)//可以给标签自己贴标签

@MustBeDocumented

//注解类构造器参数是个vararg不定参数修饰符,所以可以同时指定多个作用的目标对象

public annotation class Target(vararg val allowedTargets: AnnotationTarget)

3、@Target元注解作用的目标对象

在@Target注解中可以同时指定一个或多个目标对象,那么到底有哪些目标对象呢?这就引出另外一个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//表示作用对象是一个类型别名

}

@Retention元注解

1、介绍

Retention对应的英文意思是保留期,当它应用于一个注解上表示该注解保留存活时间,不管是Java还是Kotlin一般都有三种时期: 源代码时期(SOURCE)、编译时期(BINARY)、运行时期(RUNTIME)。

2、源码定义

@Target(AnnotationTarget.ANNOTATION_CLASS)//目标对象是注解类

public annotation class Retention(val value: AnnotationRetention = AnnotationRetention.RUNTIME)//接收一个参数,该参数有个默认值,默认是保留在运行时期

3、@Retention元注解的取值

@Retention元注解取值主要来源于AnnotationRetention枚举类

public enum class AnnotationRetention {

    SOURCE,//源代码时期(SOURCE): 注解不会存储在输出class字节码中

    BINARY,//编译时期(BINARY): 注解会存储出class字节码中,但是对反射不可见

    RUNTIME//运行时期(RUNTIME): 注解会存储出class字节码中,也会对反射可见, 默认是RUNTIME

}

@MustBeDocumented元注解

1、介绍

该注解比较简单主要是为了标注一个注解类作为公共API的一部分,并且可以保证该注解在生成的API文档中存在。

2、源码定义

@Target(AnnotationTarget.ANNOTATION_CLASS)//目标对象只能是注解类

public annotation class MustBeDocumented

@Repeatable元注解

1、介绍

这个注解决定标注的注解在一个注解在一个代码元素上可以应用两次或两次以上。

2、源码定义

@Target(AnnotationTarget.ANNOTATION_CLASS)//目标对象只能是注解类

public annotation class Repeatable

参考资源:

https://www.jianshu.com/p/8392c63b0f52

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容