Kotlin反射调用属性

 通过反射调用属性需要 KProperty 实例。KProperty 实例可以通过两种方式获得:一种是属性引用;另一种是通过 KClass 提供的 API 获得 KProperty 实例。

  • 通过反射调用属性的示例如下:
class Person(var name: String, var age: Int) {    // 1
    fun setNameAndAge(name: String, age: Int) {
        this.name = name
        this.age = age
    }

    override fun toString(): String {
        return "Person [name=$name, age=$age]"
    }
}

val count = 100    // 2

fun main(args: Array<String>) {
    val clz = Person::class
    clz.memberProperties.forEach { println(it.name) }    // 3
    // Person构造函数引用
    val personCtor = ::Person
    // 创建Person实例
    val person = personCtor.call("小三", 18)
    // 获得第一个属性
    val prop1 = clz.memberProperties.first()    // 4
    println(prop1.get(person))

    // 引用顶层属性
    val propCount = ::count    // 5
    // 读取count属性
    println(propCount.get())    // 6

    // 引用成员属性name
    val propName = Person::name    // 7
    // 写入成员属性name
    propName.set(person, "小五")    // 8
    // 读取成员属性name
    println(propName.get(person))    // 9
    // 引用成员属性age
    val propAge = Person::age
    // 写入成员属性age
    propAge.set(person, 20)
    // 读取成员属性name
    println(propAge.get(person))
}

运行结果:

age
name
18
100
小五
20

Process finished with exit code 0

代码第1行声明 Person 类,它有一个主构造函数。代码第2行声明顶层属性 count。代码第3行中的 memberProperties 属性可以获得 Person 类所有的属性集合。代码第4行获得属性集合中的第一个元素。

代码第5行是获得顶层属性 count 引用,它是一个只读属性,获得属性是通过 get 函数实现的,见代码第6行,由于是顶层属性,所以 get 函数没有参数。代码第7行是获得成员属性 name 引用,它是可读写属性。代码第8行 set 函数是写入 name 属性,set 函数的第一个参数是 person 实例,第二个参数是要写入的数值。代码第9行 get 函数是读取 name 属性,参数是 person 实例。