> 文章列表 > Kotlin反射

Kotlin反射

Kotlin反射

1、反射的概念

反射是允许程序在运行时访问程序结构的一类特性。

程序结构:类、属性方法、接口等语法特性

Kotlin反射
反射的依赖:Java的JDK中本身就包含反射API,而Kotlin则是又做了一套。

所以使用Kotlin的反射时,需要引入依赖

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

反射的常见用途

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

Java Vs Kotlin
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