Kotlin学习日记-9.简单了解反射

162 阅读2分钟

1.反射的概念

  • 反射是允许程序在运行时访问程序结构的一类特征
    • 接口
    • 方法
    • 属性等语法属性

2.反射的常见用途

  • 访问程序自身的数据,列出所有声明的属性、方法、内部类等
  • 通过class对象再通过指定名称能访问对应的函数与属性
  • 通过签名信息获取泛型实参的具体类型

3.反射常用的数据结构

数据结构概念及使用说明
KType描述未擦除的类型或泛型参数等,例如Map<String,Int>,可通过typeOf或者以下类型获取对应的父类、属性、函数等
KClass描述对象的实际类型,不包含泛型参数,例如Map,可通过对象,类型名直接获得
KProperty描述属性,可通过属性引用、属性所在类的KClass获取
KFunction描述函数,可通过函数引用、函数所在类的KClass获取

4.反射数据结构:Kotlin vs Java

KType -> Type KClass -> Class KProperty -> Field KFunction -> Method

5.Kotlin中使用反射

  • Java 反射
    • 优点:无需引入额外依赖,首次使用速度相对较快
    • 缺点:无法访问Kotlin语法特性,需对Kotlin生成的字节码足够了解
  • Kotlin 反射
    • 优点:支持访问Kotlin几乎所有特性,Api设计更加友好
    • 缺点:需引入Kotlin反射库(2.5MB,编译后400KB),首次调用时较慢

6.获取类引用

最基础的反射功能是获取Kotlin类运行时引用,要获取对静态已知Kotlin类的引用,可以使用以下语法:

val TCalzz = T::class

如果要使用Java类的引用,请使用MyClass::class.java

7.获取类成员

7.1 获取属性

范围方法
全部成员属性T::class.memberProperties
公共成员属性T::class.declaredMemberProperties
全部扩展函数T::class.memberExtensionProperties
公共扩展函数T::class.declaredMemberExtensionProperties

7.2 获取函数

范围方法
全部成员函数T::class.memberFunctions
公共成员属性T::class.declaredMemberFunctions
全部扩展函数T::class.memberExtensionFunctions
公共扩展函数T::class.declaredMemberExtensionFunctions

7.3 获取内部类

T::class.nestedClasses

7.4 获取伴生类

T::class.companionObject

7.5 获取构造器

//获取主构造器
T::class.primaryConstructor

//获取副构造器
T::class.constructors