Kotlin语言在运行时获取类

LiT*_*Tle 4 reflection kotlin

假设我们有以下内容:

val person = "Bill"
Run Code Online (Sandbox Code Playgroud)

有人可以解释这两者之间的区别:

val kClass1 = person.javaClass.kotlin    
Run Code Online (Sandbox Code Playgroud)

VS

val kClass2 = person::class
Run Code Online (Sandbox Code Playgroud)

当我应该打电话给那个而不是另一个?

任何源代码示例将不胜感激.

Ale*_*lov 7

主要原因有两种方法可以实现同样的事情,即获取Kotlin类的一个对象,是因为在Kotlin 1.1之前,::class文字不支持左侧的表达式.因此,如果您使用的是Kotlin 1.0,那么您唯一的选择就是.javaClass.kotlin,否则您对其中任何一个都没问题.这就是"Kotlin in Action"使用.javaClass.kotlin语法的原因:它是在Kotlin 1.1发布之前编写的.

这些表达式的类型也有细微差别.例如,在以下代码中

interface T

fun f1(x: T) = x::class
fun f2(x: T) = x.javaClass.kotlin
Run Code Online (Sandbox Code Playgroud)

f1的类型是KClass<out T>,但是f2类型是KClass<T>.这实际上是javaClass声明中的疏忽:KClass<out T>在这种情况下更正确,因为x类不一定T,但也可以是子类T.

否则,这两个表达式(x.javaClass.kotlinx::class)在生成的字节码和运行时性能方面完全相同.我更喜欢,x::class因为它更短,读起来更好.