通过反射调用属性需要 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
实例。
网友评论