对类的引用是通过 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文件添加红线代码
网友评论