文章

Kotlin高级——反射

开始

Kotlin反射依赖反射库实现

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

Kotlin中可以直接使用java的反射,目前java反射的性能还是高于Kotlin,因此实际使用大多使用java反射

有两种方式获取java的Class对象

  • javaClass字段
  • KClass的java字段

kotlin反射与java反射的类结构组成

反射类结构图

类引用

kotlin中的KClass类对应java的Class类

获取KClass类

1
2
3
4
5
class Person
val kClass: KClass<Person> = Person::class  // 使用类名引用
val p = Person()
// p可能是Person的子类,使用协变类型接收
val objClass: KClass<out Person> = p::class  // 对象引用,获取到的是实际类型

函数引用

函数使用::引用,引用的类型为KFunction

1
2
3
4
5
6
7
8
9
fun say(a: String): Int {
    return 0
}
val f0: KFunction<Int> = ::say
// 成员函数引用
class Person {
    fun say(): Int = 0
}
val pf1: KFunction<Int> = Person::say

属性引用

属性使用::引用,引用类型为KProperty

1
2
3
4
5
6
7
8
9
10
11
12
val x = 20
val x0: KProperty<Int> = ::x
// 可变属性引用
var y = 20
val y0: KMutableProperty<Int> = ::y
// 成员属性引用
class Person {
    val x = 20
    var y = 20
}
val px1: KProperty<Int> = Person::x
val py1: KMutableProperty<Int> = Person::y
本文由作者按照 CC BY 4.0 进行授权