Kotlin反射
1、反射的概念
反射是允许程序在运行时访问程序结构的一类特性。
反射的依赖:Java的JDK中本身就包含反射API,而Kotlin则是又做了一套。
所以使用Kotlin的反射时,需要引入依赖
implementation "org.jetbrains.kotlin:kotlin-reflect"
反射的常见用途
- 列出类型的所有属性、方法、内部类等
- 调用给定名称及签名的方法,或访问指定名称的属性
- 通过签名信息获取泛型实参的具体类型
- 访问运行时注解及其信息,完成注入或配置操作
Java Vs Kotlin
2、示例
2.1、类
class Teacher {var tName: String? = nullvar tSex: String? = nullvar tAge: Int = 0//无参构造方法constructor() {tName = "xName"tSex = "xSex"tAge = 0}//有参构造方法constructor(name: String?,sex: String?,age: Int) {tName = nametSex = sextAge = age}//扩展方法fun String.getStringLength() = this.lengthfun Int.add(year: Int): Int {return this + year}//扩展属性val String.lastChar: Char get() = this[length - 1]val String.firstChar: Char get() = this[0]//姓名fun setName(name: String?) {tName = name}fun getName() = tName//性别fun setSex(sex: String?) {tSex = sex}fun getSex() = tSex//年龄fun setAge(age: Int) {tAge = age}fun getAge() = tAge}
fun main(){//类val kTeacher: KClass<Teacher> = Teacher::classtestKTeacher.invoke(kTeacher)
}val testKTeacher: (KClass<Teacher>) -> Unit = { kTeacher ->println("------------------------- kTeacher --------------------------")println("kTeacher.isAbstract: ${kTeacher.isAbstract}")println("kTeacher.isData: ${kTeacher.isData}")println("kTeacher.isFinal: ${kTeacher.isFinal}")println("kTeacher.isCompanion: ${kTeacher.isCompanion}")println("kTeacher.isFun: ${kTeacher.isFun}")println("kTeacher.isInner: ${kTeacher.isInner}")println("kTeacher.isOpen: ${kTeacher.isOpen}")println("kTeacher.isSealed: ${kTeacher.isSealed}")println("kTeacher.isValue: ${kTeacher.isValue}")println("kTeacher.qualifiedName: ${kTeacher.qualifiedName}")println("kTeacher.simpleName: ${kTeacher.simpleName}")println("--- 类中的扩展属性 ---")kTeacher.declaredMemberExtensionProperties.forEach {println("kTeacher.declaredMemberExtensionProperties: $it}")}println("--- 类中的扩展方法 ---")kTeacher.declaredMemberExtensionFunctions.forEach {println("kTeacher.declaredMemberExtensionFunctions: ${it}")}println("--- declaredMemberProperties ---")kTeacher.declaredMemberProperties.forEach {println("kTeacher.declaredMemberProperties: ${it}")}println("--- declaredFunctions ---")kTeacher.declaredFunctions.forEach {println("kTeacher.declaredFunctions: ${it}")}println("--- declaredMembers ---")kTeacher.declaredMembers.forEach {println("kTeacher.declaredMembers: ${it}")}println("--- declaredMemberFunctions ---")kTeacher.declaredMemberFunctions.forEach {println("kTeacher.declaredMemberFunctions: ${it}")}
}
log日志
------------------------- kTeacher --------------------------
kTeacher.isAbstract: false
kTeacher.isData: false
kTeacher.isFinal: true
kTeacher.isCompanion: false
kTeacher.isFun: false
kTeacher.isInner: false
kTeacher.isOpen: false
kTeacher.isSealed: false
kTeacher.isValue: false
kTeacher.qualifiedName: com.example.kotlinlearning_zlz.learning.Teacher
kTeacher.simpleName: Teacher
--- 类中的扩展属性 ---
kTeacher.declaredMemberExtensionProperties: val com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)firstChar: kotlin.Char}
kTeacher.declaredMemberExtensionProperties: val com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)lastChar: kotlin.Char}
--- 类中的扩展方法 ---
kTeacher.declaredMemberExtensionFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.Int.)add(kotlin.Int): kotlin.Int
kTeacher.declaredMemberExtensionFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)getStringLength(): kotlin.Int
--- declaredMemberProperties ---
kTeacher.declaredMemberProperties: var com.example.kotlinlearning_zlz.learning.Teacher.tAge: kotlin.Int
kTeacher.declaredMemberProperties: var com.example.kotlinlearning_zlz.learning.Teacher.tName: kotlin.String?
kTeacher.declaredMemberProperties: var com.example.kotlinlearning_zlz.learning.Teacher.tSex: kotlin.String?
--- declaredFunctions ---
kTeacher.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getAge(): kotlin.Int
kTeacher.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getName(): kotlin.String?
kTeacher.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getSex(): kotlin.String?
kTeacher.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setAge(kotlin.Int): kotlin.Unit
kTeacher.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setName(kotlin.String?): kotlin.Unit
kTeacher.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setSex(kotlin.String?): kotlin.Unit
kTeacher.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.Int.)add(kotlin.Int): kotlin.Int
kTeacher.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)getStringLength(): kotlin.Int
--- declaredMembers ---
kTeacher.declaredMembers: var com.example.kotlinlearning_zlz.learning.Teacher.tAge: kotlin.Int
kTeacher.declaredMembers: var com.example.kotlinlearning_zlz.learning.Teacher.tName: kotlin.String?
kTeacher.declaredMembers: var com.example.kotlinlearning_zlz.learning.Teacher.tSex: kotlin.String?
kTeacher.declaredMembers: val com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)firstChar: kotlin.Char
kTeacher.declaredMembers: val com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)lastChar: kotlin.Char
kTeacher.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.getAge(): kotlin.Int
kTeacher.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.getName(): kotlin.String?
kTeacher.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.getSex(): kotlin.String?
kTeacher.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.setAge(kotlin.Int): kotlin.Unit
kTeacher.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.setName(kotlin.String?): kotlin.Unit
kTeacher.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.setSex(kotlin.String?): kotlin.Unit
kTeacher.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.Int.)add(kotlin.Int): kotlin.Int
kTeacher.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)getStringLength(): kotlin.Int
--- declaredMemberFunctions ---
kTeacher.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getAge(): kotlin.Int
kTeacher.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getName(): kotlin.String?
kTeacher.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getSex(): kotlin.String?
kTeacher.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setAge(kotlin.Int): kotlin.Unit
kTeacher.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setName(kotlin.String?): kotlin.Unit
kTeacher.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setSex(kotlin.String?): kotlin.Unit
2.2、对象
fun main(){//对象val teacherLeon = Teacher("Leon", "Man", 26)val kLeon: KClass<out Teacher> = teacherLeon::classtestKLeon.invoke(kLeon)
}val testKLeon: (KClass<out Teacher>) -> Unit = { kLeon ->println("------------------------- kLeon --------------------------")println("kLeon.isAbstract: ${kLeon.isAbstract}")println("kLeon.isData: ${kLeon.isData}")println("kLeon.isFinal: ${kLeon.isFinal}")println("kLeon.isCompanion: ${kLeon.isCompanion}")println("kLeon.isFun: ${kLeon.isFun}")println("kLeon.isInner: ${kLeon.isInner}")println("kLeon.isOpen: ${kLeon.isOpen}")println("kLeon.isSealed: ${kLeon.isSealed}")println("kLeon.isValue: ${kLeon.isValue}")println("kLeon.qualifiedName: ${kLeon.qualifiedName}")println("kLeon.simpleName: ${kLeon.simpleName}")println("--- 类中的扩展属性 ---")kLeon.declaredMemberExtensionProperties.forEach {println("kLeon.declaredMemberExtensionProperties: $it}")}println("--- 类中的扩展方法 ---")kLeon.declaredMemberExtensionFunctions.forEach {println("kLeon.declaredMemberExtensionFunctions: ${it}")}println("--- declaredMemberProperties ---")kLeon.declaredMemberProperties.forEach {println("kLeon.declaredMemberProperties: ${it}")}println("--- declaredFunctions ---")kLeon.declaredFunctions.forEach {println("kLeon.declaredFunctions: ${it}")}println("--- declaredMembers ---")kLeon.declaredMembers.forEach {println("kLeon.declaredMembers: ${it}")}println("--- declaredMemberFunctions ---")kLeon.declaredMemberFunctions.forEach {println("kLeon.declaredMemberFunctions: ${it}")}
}
log日志
------------------------- kLeon --------------------------
kLeon.isAbstract: false
kLeon.isData: false
kLeon.isFinal: true
kLeon.isCompanion: false
kLeon.isFun: false
kLeon.isInner: false
kLeon.isOpen: false
kLeon.isSealed: false
kLeon.isValue: false
kLeon.qualifiedName: com.example.kotlinlearning_zlz.learning.Teacher
kLeon.simpleName: Teacher
--- 类中的扩展属性 ---
kLeon.declaredMemberExtensionProperties: val com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)firstChar: kotlin.Char}
kLeon.declaredMemberExtensionProperties: val com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)lastChar: kotlin.Char}
--- 类中的扩展方法 ---
kLeon.declaredMemberExtensionFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.Int.)add(kotlin.Int): kotlin.Int
kLeon.declaredMemberExtensionFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)getStringLength(): kotlin.Int
--- declaredMemberProperties ---
kLeon.declaredMemberProperties: var com.example.kotlinlearning_zlz.learning.Teacher.tAge: kotlin.Int
kLeon.declaredMemberProperties: var com.example.kotlinlearning_zlz.learning.Teacher.tName: kotlin.String?
kLeon.declaredMemberProperties: var com.example.kotlinlearning_zlz.learning.Teacher.tSex: kotlin.String?
--- declaredFunctions ---
kLeon.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getAge(): kotlin.Int
kLeon.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getName(): kotlin.String?
kLeon.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getSex(): kotlin.String?
kLeon.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setAge(kotlin.Int): kotlin.Unit
kLeon.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setName(kotlin.String?): kotlin.Unit
kLeon.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setSex(kotlin.String?): kotlin.Unit
kLeon.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.Int.)add(kotlin.Int): kotlin.Int
kLeon.declaredFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)getStringLength(): kotlin.Int
--- declaredMembers ---
kLeon.declaredMembers: var com.example.kotlinlearning_zlz.learning.Teacher.tAge: kotlin.Int
kLeon.declaredMembers: var com.example.kotlinlearning_zlz.learning.Teacher.tName: kotlin.String?
kLeon.declaredMembers: var com.example.kotlinlearning_zlz.learning.Teacher.tSex: kotlin.String?
kLeon.declaredMembers: val com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)firstChar: kotlin.Char
kLeon.declaredMembers: val com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)lastChar: kotlin.Char
kLeon.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.getAge(): kotlin.Int
kLeon.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.getName(): kotlin.String?
kLeon.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.getSex(): kotlin.String?
kLeon.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.setAge(kotlin.Int): kotlin.Unit
kLeon.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.setName(kotlin.String?): kotlin.Unit
kLeon.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.setSex(kotlin.String?): kotlin.Unit
kLeon.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.Int.)add(kotlin.Int): kotlin.Int
kLeon.declaredMembers: fun com.example.kotlinlearning_zlz.learning.Teacher.(kotlin.String.)getStringLength(): kotlin.Int
--- declaredMemberFunctions ---
kLeon.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getAge(): kotlin.Int
kLeon.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getName(): kotlin.String?
kLeon.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.getSex(): kotlin.String?
kLeon.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setAge(kotlin.Int): kotlin.Unit
kLeon.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setName(kotlin.String?): kotlin.Unit
kLeon.declaredMemberFunctions: fun com.example.kotlinlearning_zlz.learning.Teacher.setSex(kotlin.String?): kotlin.Unit
2.3、object
fun main(){//两句等价, 对于object类型D.show()D::class.objectInstance?.run { show() }
}object D {fun show() {println("这是object D")}
}
log日志
这是object D
这是object D
2.4、父类
fun main(){C::class.supertypes.forEach {println("C的父类 $it") //B}
}open class A {}open class B : A() {}class C : B() {}
log日志
C的父类 com.example.kotlinlearning_zlz.learning.B
2.5、KClass和KType
fun main(){//KClass和KType//KClass已被擦除,没有泛型实参//KType有泛型实参val xKClass = X::classprintln("KClass: $xKClass")val xKType = typeOf<X<String, Int>>()xKType.arguments.forEach {println("KType: $it")}
}class X<T, R> {private var t: T? = nullprivate var r: R? = null
}
log日志
KClass: class com.example.kotlinlearning_zlz.learning.X
KType: kotlin.String
KType: kotlin.Int