美文网首页工作生活
Kotlin反射(2)引用类

Kotlin反射(2)引用类

作者: 狼性代码人 | 来源:发表于2019-07-06 06:45 被阅读0次

      对类的引用是通过 KClass 实现的,KClass 是实现反射的关键所在,KClass 的一个实例表示对类的引用。在程序代码中引用类使用 :: 运算符,引用类的示例代码如下:

    fun main(args: Array<String>) {
        // 方法一:"类名::class"
        val clz1 = Int::class
        val clz2 = Person::class
        // 方法二:"对象::class"
        val person = Person("小三")
        val clz3 = person::class
    }
    

      从上述代码可见,引用类有两种形式:类名::class对象::class。clz1、clz2 和 clz3 都是 KClass 类型,表示一个类的引用,其中 clz1 是 KClass<Int> 类型,clz2、clz3 是 KClass<Person> 类型。

      KClass 类提供了很多函数可以获得运行时对象的相关信息,下面的程序代码展示了其中一些函数。

    data class Person(val name: String)
    
    fun main(args: Array<String>) {
        // 方法一:"类名::class"
        val clz1 = Int::class
        val clz2 = Person::class
        // 方法二:"对象::class"
        val person = Person("小三")
        val clz3 = person::class
    
        println("clz1 类名:${clz1.simpleName}")
        println("clz1 类全名:${clz1.qualifiedName}")
    
        println("clz2 是否为抽象类或接口:${clz2.isAbstract}")
        println("clz2 是否为数据类:${clz2.isData}")
        var sBuilder = StringBuilder()
        clz2.members.joinTo(sBuilder, ", ", "[", "]")
        println("clz2 所有成员:${sBuilder.toString()}")
    
        sBuilder = StringBuilder()
        clz2.members.filter { it is KProperty }.joinTo(sBuilder, ", ", "[", "]")
        println("clz2 所有属性:${sBuilder.toString()}")
    }
    

    运行结果

    clz1 类名:Int
    clz1 类全名:kotlin.Int
    clz2 是否为抽象类或接口:false
    clz2 是否为数据类:true
    clz2 所有成员:[val cn.ak.kotmodule.kot.Person.name: kotlin.String, fun cn.ak.kotmodule.kot.Person.component1(): kotlin.String, fun cn.ak.kotmodule.kot.Person.copy(kotlin.String): cn.ak.kotmodule.kot.Person, fun cn.ak.kotmodule.kot.Person.equals(kotlin.Any?): kotlin.Boolean, fun cn.ak.kotmodule.kot.Person.hashCode(): kotlin.Int, fun cn.ak.kotmodule.kot.Person.toString(): kotlin.String]
    clz2 所有属性:[val cn.ak.kotmodule.kot.Person.name: kotlin.String]
    
    

    注意:Kotlin 反射 API 所需要的运行时组件来自于独立的 kotlin-reflect.jar 文件,在 Android 等移动平台上为了减少应用程序包的大小,应用程序包再默认情况下不包含 kotlin-reflect.jar 文件。如果要在应用中使用反射功能,则需要额外添加 kotlin-reflect.jar 文件至应用程序包中,并添加 kotlin-reflect.jar 到项目的类路径。

    • 下面是导入 kotlin-reflect.jar 的方法:
      build.gradle文件添加红线代码

    相关文章

      网友评论

        本文标题:Kotlin反射(2)引用类

        本文链接:https://www.haomeiwen.com/subject/gkechctx.html