??通過反射調用屬性需要 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
// 創(chuàng)建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
實例。