Kotlin 和 Java 反射
- 1)Kotlin 的
KClass
和 Java 的Class
可以看作同一个含义的类型,并且可以通过.java
和.kotlin
方法在KClass
和Class
之间互相转化。 - 2)Kotlin 的
KCallable
和 Java 的AccessiableObject
都可以理解为可调用元素。Java 中构造方法为一个独立的类型,而 Kotlin 则统一作为KFunction
处理。 - 3)Kotlin 的
KProperty
和 Java 的Field
不太相同。Kotlin 的KProperty
通常指相应的Getter
和Setter
(只有可变属性Setter
)整体作为一个KProperty
(通常情况 Kotlin 并不存在字段的概念),而 Java 的Field
通常仅仅指字段本身。
在某些情况下(通常是碰到一些Kotlin独有的特性时)Kotlin编译器会在生产的字节码中存储额外信息,这些信息目前是通过 kotlin.Metadata
解实现的。Kotlin 编译器会用 Metadata
标注这些类。
Kotlin 的 KClass
KClass
的特别属性或者函数(在Kotlin中独有,Java没有与之对应的特性):
属性或函数名称 | 含义 |
---|---|
isCompanion |
是否伴生对象 |
isData |
是否数据类 |
isSealed |
是否密封类 |
objectInstance |
object 实例(如果是object ) |
companionObjectInstance |
伴生对象实例 |
declaredMemberExtensionFunctions |
扩展函数(声明的) |
declaredMemberExtensionProperties |
扩展属性(声明的) |
memberExtensionFunctions |
本类及超类扩展函数 |
memberExtensionProperties |
本类及超类扩展属性 |
starProjectedType |
泛型通配类型 |
Kotlin 的 KCallable
Kotlin 把 Class
中的属性(Property
)、函数(Funciton
)甚至构造函数都看作 KCallable
,因为它们是可调用的,它们都是Class
的成员。那我们如何获取一个Class
的成员呢?
KClass
给我们提供了一个members
方法,它的返回值就是一个Collection<KCallable<*>>
。
KCallable
提供的 API:
API 描述 | 含义 |
---|---|
isAbstract: Boolean |
此 KCallable 是否为抽象的 |
isFinal: Boolean |
此 KCallable 是否为 final 的 |
isOpen: Boolean |
此 KCallable 是否为 open 的 |
name: String |
此 KCallable 的名称 |
parameters: List<KParameter> |
调用此 KCallable 需要的参数 |
returnType: KType |
此 KCallable 的返回类型 |
typeParameters: List<KTypeParameter> |
此 KCallable 的类型参数 |
visibility: KVisibility? |
此 KCallable 的可见性 |
call(vararg args: Any?): R |
给定参数调用此 KCallable |
KMutableProperty
是KProperty
的一个子类,那我们如何识别一个属性是KMutableProperty
还是KProperty
呢?参考如下代码:
fun KMutablePropertyShow() {
val p = Person("张三", 8, "HangZhou")
val props = p::class.memberProperties
for (prop in props) {
when (prop) {
is KMutableProperty<*> -> prop.setter.call(p, "Hefei")
else -> prop.call(p)
}
}
println(p.address)
}
获取参数信息
Kotlin 把参数分为3个类别,分别是函数的参数(KParameter
)、函数的返回值(KType
)及类型参数(KTypeParameter
)。
KParameter
使用KCallabel.parameters
即可获取一个List<KParameter>
,它代表的是函数(包括扩展函数)的参数。
API 描述 | 含义 |
---|---|
index: Int |
返回该参数在参数列表里面的索引 |
isOptional: Boolean |
该参数是否为 Optional |
isVararg: Boolean |
该参数是否为 vararg |
kind: Kind |
该参数的 Kind |
name: String? |
该参数的名称 |
type: KType |
该参数的类型 |
fun KParameterShow() {
// val p = Person("张三", 8, "HangZhou")
for (c in Person::class.members) {
print("${
c.name} -> ")
for (p in c.parameters) {
print("${
p.type}" + " -- ")
}
println()
}
}
运行结果: