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
        }
}

 

posted on 2018-12-20 14:31  LoaderMan  阅读(2000)  评论(0编辑  收藏  举报

导航