Kotlin反射(5)调用属性

  通过反射调用属性需要 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) {
    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 实例。

你可能感兴趣的:(Kotlin反射(5)调用属性)