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