工作生活

Kotlin反射(2)引用类

2019-07-06  本文已影响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 到项目的类路径。

上一篇下一篇

猜你喜欢

热点阅读