深入理解 Kotlin 注解与注解处理技术
注解(Annotation)是现代编程语言中非常重要的一项元编程技术,在 Java 和 Kotlin 世界中也发挥着不可替代的作用。特别是在 Android 开发中,大量框架(如 retrofit、Hilt、ARouter)都依赖注解在编译期生成代码,提高开发效率和安全性。
本文将深入探讨 Kotlin 中的注解机制,重点理解注解的声明、应用、以及与编译期注解处理器(APT/KAPT)的集成实践。
一、Kotlin 中的注解基础
在 Kotlin 中声明注解非常简单,使用 annotation class 关键字:
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val desc: String)
📌 什么是元注解(Meta-Annotations)?
元注解是用来修饰注解类本身的注解,即:用来定义注解“应该如何被使用”的注解。
在 Kotlin(与 Java 类似)中,定义注解时我们可以使用一些系统提供的元注解,比如:
| 元注解 | 作用说明 |
|---|---|
| @Target | 指定这个注解可以用在哪些代码结构上(类、函数、属性等) |
| @Retention | 指定注解在编译、运行时是否可见(影响注解能否通过反射获取) |
| @Repeatable | 是否支持同一个元素重复使用这个注解 |
| @MustBeDocumented | 指定注解是否会包含在 KDoc 文档中 |
retention source注解仅保留在源码级别中,编译时会被忽略,class 编译时会被编译器保留,但在java虚拟机运行时会被忽略 runtime java运行时保留 应用场景: source:IDE语法检查,apt技术(动态生成辅助代码,arouter、retrofit) class:aop切面编程(是否登录检查)、字节码插桩 runtime:反射获取方法或类上的信息,做额外操作
二、Kotlin apt使用注意事项
- 创建注解处理器模块,必须是java模块:
然后主工程通过app/build.gradle/ 通过
plugins {
alias(libs.plugins.jetbrains.kotlin.kapt)
}
的方式引入kapt,这样在
dependencies {
kapt(project(":compiler"))
}
通过kapt引入注解处理器模块, 需要而外注意到地方是,在项目的根目录下的build.gradle.kts 里面也要添加
plugins {
alias(libs.plugins.jetbrains.kotlin.kapt) apply false
alias(libs.plugins.jetbrains.kotlin.jvm) apply false
}
下面是注解处理器:
@SupportedAnnotationTypes("com.example.annotation.HeiSenBerg")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
class MyAnnotation : AbstractProcessor() {
override fun process(p0: MutableSet<out TypeElement>?, p1: RoundEnvironment?): Boolean {
val messager = processingEnv.messager
messager.printMessage(Diagnostic.Kind.NOTE,"11111111111111111")
return false
}
}
process在第一次编译的时候触发,后续如果代码没有改动,将不会再次触发