Kotlin笔记-030反射

535 阅读2分钟

反射

Kotlin 中反射需要使用单独反射 API,需要引入反射的依赖。

implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.61"

反射作用

  • 列出类型的所有属性,方法,内部类等
  • 调用给定名称以及签名的方法或访问指定名称的属性
  • 通过签名信息获取泛型实参的具体类型
  • 访问运行时注解及其信息,完成诸如或者配置操作

反射的数据结构

  • KType:描述未擦除的类型或泛型参数等,例如 Map<String,Int>;可通过 typeOf 或者以下类型获取对应的父类、属性、函数参数等
  • KClass:描述对象的实际类型,不包括泛型参数,例如 Map;可通过对象、类型名称直接获得
  • KProperty:描述属性,可通过属性引用、属性所在类的 KClass 获取
  • KFunction:描述函数,可通过函数引用、函数所在类的 KClass 获取

反射数据结构的区别

KotlinvsJava
KType相当于Type
KClass相当于Class
KProperty近似于Field
KFunction近似于Method

反射的调用示例

@ExperimentalStdlibApi
fun main() {
    // 获取类
    val cls: KClass<String> = String::class
    // 获取属性
    val strProperty: KProperty1<String, *>? = cls.declaredMemberProperties.firstOrNull()
    // 获取函数
    val strFunc:KFunction<*>? = cls.declaredFunctions.firstOrNull()

    // 获取类型;只能得到类型擦除后的类型
    val mapCls: KClass<Map<*, *>> = Map::class
    // 获取类型;可以得到具体类型;方法调用需要 ExperimentalStdlibApi 注解
    val mapType: KType = typeOf<Map<String, Int>>()
    // 获取参数的类型
    val argument1: KTypeProjection = mapType.arguments[0] // 返回 String 类型
    val argument2: KTypeProjection = mapType.arguments[1] // 返回 Int 类型
}

反射

Kotlin 中反射需要使用单独反射 API,需要引入反射的依赖。

implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.61"

反射作用

  • 列出类型的所有属性,方法,内部类等
  • 调用给定名称以及签名的方法或访问指定名称的属性
  • 通过签名信息获取泛型实参的具体类型
  • 访问运行时注解及其信息,完成诸如或者配置操作

反射的数据结构

  • KType:描述未擦除的类型或泛型参数等,例如 Map<String,Int>;可通过 typeOf 或者以下类型获取对应的父类、属性、函数参数等
  • KClass:描述对象的实际类型,不包括泛型参数,例如 Map;可通过对象、类型名称直接获得
  • KProperty:描述属性,可通过属性引用、属性所在类的 KClass 获取
  • KFunction:描述函数,可通过函数引用、函数所在类的 KClass 获取

反射数据结构的区别

KotlinvsJava
KType相当于Type
KClass相当于Class
KProperty近似于Field
KFunction近似于Method

反射的调用示例

@ExperimentalStdlibApi
fun main() {
    // 获取类
    val cls: KClass<String> = String::class
    // 获取属性
    val strProperty: KProperty1<String, *>? = cls.declaredMemberProperties.firstOrNull()
    // 获取函数
    val strFunc:KFunction<*>? = cls.declaredFunctions.firstOrNull()

    // 获取类型;只能得到类型擦除后的类型
    val mapCls: KClass<Map<*, *>> = Map::class
    // 获取类型;可以得到具体类型;方法调用需要 ExperimentalStdlibApi 注解
    val mapType: KType = typeOf<Map<String, Int>>()
    // 获取参数的类型
    val argument1: KTypeProjection = mapType.arguments[0] // 返回 String 类型
    val argument2: KTypeProjection = mapType.arguments[1] // 返回 Int 类型
}