• Kotlin学习之反射


    获取Class对象

    fun main(args: Array<String>) {
        val nums = ArrayList<Int>()
        println(nums::class)
        println(Person::class)
        val person = Person()
        println(person::class)
    }
    class Person
    

    通过[对象/类]::class的格式获取到kotlin中的Class,实际为KClass类型,类似java中的Class。

    操作属性和方法

    import kotlin.reflect.KMutableProperty
    import kotlin.reflect.full.memberFunctions
    import kotlin.reflect.full.memberProperties
    import kotlin.reflect.full.superclasses
    
    fun main(args: Array<String>) {
        val person = Person()
        val personClass = Person::class
        //获取所有父类
        println(personClass.superclasses)
        //获取到name属性,有可能为null
        val nameProperty = personClass.memberProperties.find { it.name.equals("name") }
        //获取属性值,get()和call()效果一样
        println(nameProperty?.get(person))//lisi
        println(nameProperty?.call(person))//lisi
        //判断参数是否为可变的,是否为var
        if (nameProperty is KMutableProperty<*>) {
            //修改属性值,调用setter方法
            nameProperty.setter.call(person, "小明")
        }
        println(person)//name:小明
        //获取到printName方法,有可能为null
        val printNameFunc = personClass.memberFunctions.find { it.name.equals("printName") }
        //方法执行
        printNameFunc?.call(person)//小明
    }
    
    class Person {
        var name: String = "lisi"
        fun printName() {
            println(name)
        }
        override fun toString(): String {
            return "name:$name"
        }
    }
    

    核心为KClass,通过它可以获取到属性,方法,扩展方法,构造器等所有信息。

  • 相关阅读:
    nslookup查询结果详解
    【Web页面测试】测试点和测试用例
    【CloverETL培训】题目
    VirtualBox虚拟机网络设置(四种方式)
    Web系统测试Web安全性测试
    sqlserver字段类型详解
    详解SVN 的使用
    Javascript闭包——懂不懂由你,反正我是懂了
    Javascript的console.log()用法
    [ JS 进阶 ] test, exec, match, replace
  • 原文地址:https://www.cnblogs.com/strongmore/p/16326943.html
Copyright © 2020-2023  润新知