Kotlin(七)深入理解Kotlin注解

本文详细介绍了Kotlin中的注解机制,包括注解的作用、如何在Kotlin中声明注解、使用注解于类、字段和方法,以及元注解如@Target和@Retention的用法。特别关注了与Java注解的兼容性。
摘要由CSDN通过智能技术生成

目录

  • Kotlin的注解是怎样子的?
  • 如何声明Kotlin注解?
  • 如何使用Kotlin注解?
  • Kotlin中的元注解
  • 注解的使用场景
  • 案例:自定义注解实现API调用时的请求方法检查

Kotlin的注解是怎样子的?

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

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

如何声明Kotlin注解?

在Kotlin中的声明注解的方式和Java稍微不一样,在Java中主要是通过 @interface关键字来声明,而在Kotlin中只需要通过 annotation class 来声明。

Java注解的声明

//Java中的注解通过@interface关键字进行定义,它和接口声明类似,只不过在前面多加@
@interface ApiDoc {
String value();
}

Kotlin注解的声明

//和一般的声明很类似,只是在class前面加上了annotation修饰符
annotation class ApiDoc(val value: String)

如何使用Kotlin注解?

在Kotlin中使用注解和Java一样:

@ApiDoc(“修饰类”)
class Box {
@ApiDoc(“修饰字段”)
val size = 6

@ApiDoc(“修饰方法”)
fun test() {

}
}

Kotlin中的元注解

和Java一样在Kotlin中一个Kotlin注解类自己本身也可以被注解,可以给注解类加注解,我们把这种注解称为元注解。

Kotlin中的元注解类定义于kotlin.annotation包中,主要有:

  • @Target:定义注解能够应用于那些目标对象
  • @Retention:注解的保留期
  • @Repeatable:标记的注解可以多次应用于相同的声明或类型
  • @MustBeDocumented:修饰的注解将被文档工具提取到API文档中

4种元注解,相比Java中5种元注解少了@Inherited,在这里四种元注解中最常用的是前两种,接下来我们就来重点分析下前两种元注解:

@Target

@Target顾名思义就是目标对象,也就是我们定义的注解能够应用于那些目标对象,可以同时指定多个作用的目标对象。

@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注解只能被应用于类上,如果将它应用在方法或字段上则会抛出异常:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

推荐学习资料


  • 脑图
    360°全方位性能调优

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

5iu9-1711865781363)]
[外链图片转存中…(img-njXBKrhE-1711865781364)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值