Kotlin 中的 ::class 和 ::class.java 有什么区别?

Sey*_*bol 24 kotlin

在 Java 中,我们编写.class(例如:)String.class来获取有关给定类的信息。在 Kotlin 中,您可以编写::class::class.java. 它们之间有什么区别?

ard*_*nit 21

通过使用::class,您可以获得 KClass 的一个实例。它是 Kotlin 反射 API,可以处理 Kotlin 特性,如属性、数据类等。

通过使用::class.java,您可以获得 Class 的一个实例。它是 Java 反射 API,可与任何 Java 反射代码互操作,但不能与某些 Kotlin 功能一起使用。

  • 为什么编译器不能为我们处理这个问题?愚蠢的我花了30分钟寻找这个...... (4认同)

Nul*_*e08 15

首先您需要了解反射。根据文档:

反射是一组语言和库功能,允许在运行时内省自己的程序的结构。

简而言之,它使您能够获取您编写的代码,即您定义的类名、您定义的函数名等。您编写的所有内容,您都可以在运行时使用Reflection.

::class::class.java是反射的基本特征。

::class给你一个KClass<T>参考,::class.java给你Class<T>参考。例子,

val a = MyClass::class
Run Code Online (Sandbox Code Playgroud)

可以解释为

val a = KClass<MyClass>()
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码在语法上不正确,因为KClass是一个接口,并且接口无法实例化。这只是为了给你一个想法。

Class<T>为您提供有关 T 类的元数据的信息,例如它正在实现的接口、其函数名称、其包名称等。

KClass与 类似,Class但它提供了比 . 更多属性(Kotlin 相关属性)的信息ClassKClass<T>此处列出了参考资料可以为您提供的有关 T 类的所有信息https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/-k-class/#properties


Gee*_*bha 7

根据 Kotlin 文档,当我们使用以下任何类类型创建对象时,引用类型将是 KClass 类型。

val c = MyClass::class  // reference type of KClass
Run Code Online (Sandbox Code Playgroud)

Kotlin 类引用与 Java 类引用不同。要获取 Java 类引用,请使用 KClass 实例上的 .java 属性。

val c = MyClass::class.java  // reference type of Java
Run Code Online (Sandbox Code Playgroud)

您可以参考 Kotlin 文档了解更多详情。 https://kotlinlang.org/docs/reference/reflection.html#class-references