深入理解 Kotlin 注解与注解处理技术

114 阅读2分钟

深入理解 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模块:

image.png

然后主工程通过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在第一次编译的时候触发,后续如果代码没有改动,将不会再次触发