Kotlin中反射


枚舉類成員

import kotlin.reflect.full.memberFunctions
import kotlin.reflect.full.memberProperties

fun main(arg: Array<String>) {
    val p = Person::class  //類引用
    println("成員列表(屬性和函數)" + p.members.size)


    for (member in p.members) {
        println(member.name + " " + member.returnType)
    }
    println("屬性個數" + p.memberProperties.size)
    for (member in p.memberProperties) {
        println(member.name + " " + member.returnType)
    }
    println("函數個數" + p.memberFunctions.size)
    for (member in p.memberFunctions) {
        println(member.name + " " + member.returnType)
    }
}



class Person(val value: String, val num: Int) {
    fun process() {

    }
}

輸出:

成員列表(屬性和函數)6
num kotlin.Int
value kotlin.String
process kotlin.Unit
equals kotlin.Boolean
hashCode kotlin.Int
toString kotlin.String
屬性個數2
num kotlin.Int
value kotlin.String
函數個數4
process kotlin.Unit
equals kotlin.Boolean
hashCode kotlin.Int
toString kotlin.String

動態調用成員函數

fun main(arg: Array<String>) {
    val p = Person::process  //類引用
    //調用invoke函數執行process函數
    p.invoke(Person("abc",20))
    //利用java的反射機制指定process方法的名字
    val method = Person::class.java.getMethod("process")
    //動態調用process函數
    method.invoke(Person("tom",25))
}



class Person(val value: String, val num: Int) {
    fun process() {
       println("value $value num $num")
    }
}

動態調用成員屬性

fun main(arg: Array<String>) {
    val person = Person()
    //獲取屬性對象
    val name = Person::name
    //讀取屬性值
    println(name.get(person))
    //設置屬性值
    name.set(person, "new")
    println(name.get(person))

}


class Person() {
    var name: String = "tom"
        get() = field
        set(value) {
            field = value
        }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM