第 15 章:注解与反射
15.1 注解的定义与使用
1. 注解的基本概念
注解(Annotation)是 Kotlin 中用于为代码附加元数据的工具,它不会直接影响程序的逻辑,但可以在编译时或运行时被编译器、框架或反射 API 读取和处理。Kotlin 的注解语法与 Java 类似,但提供了更简洁的语法和更强的表达能力。
2. 注解的声明
Kotlin 中通过 annotation 关键字定义注解。注解可以包含属性(参数),但属性类型必须是以下之一:
- 基本数据类型(
Int、Long、String等) - 其他注解
- 上述类型的数组
示例:定义一个注解
annotation class MyAnnotation(
val description: String,
val priority: Int = 0
)
3. 注解的使用
注解可以应用于类、函数、属性、参数等代码元素。
示例:在函数和属性上使用注解
@MyAnnotation(description = "测试函数", priority = 1)
fun testFunction() {
println("Hello, Annotation!")
}
class User {
@MyAnnotation("用户ID字段")
val id: Int = 1
}
4. 常见内置注解
Kotlin 提供了一些内置注解,用于控制编译行为或与 Java 互操作:
@JvmStatic:将伴生对象的成员暴露为 Java 静态方法。@JvmOverloads:为默认参数生成重载方法(兼容 Java)。@Deprecated:标记已过时的代码。
示例:使用 @Deprecated
@Deprecated("使用新函数 newFunction() 替代", ReplaceWith("newFunction()"))
fun oldFunction() { /* ... */ }
5. 注解的运行时保留
默认情况下,Kotlin 注解在编译后会被丢弃(仅保留在源码级别)。若需要在运行时通过反射读取注解,需显式指定 @Retention 为 RUNTIME:
@Retention(AnnotationRetention.RUNTIME)
annotation class RuntimeAnnotation
6. 注解的实践场景
- 框架集成:如 Spring Boot 的
@RestController、Room 的@Entity。 - 代码生成:通过注解处理器(如
kapt)生成代码(如 Dagger 2)。 - 静态检查:结合
@RequiresApi或自定义注解限制 API 使用范围。
下一步学习:了解如何通过元注解(如 @Target)进一步控制注解的作用目标(15.2 元注解)。
