簡體   English   中英

Kotlin 中的 ::class 和 ::class.java 有什么區別?

[英]What is the difference between ::class and ::class.java in Kotlin?

在 Java 中,我們編寫.class (例如: String.class )來獲取有關給定類的信息。 在 Kotlin 中,您可以編寫::class::class.java 它們之間有什么區別?

通過使用::class ,您可以獲得 KClass 的一個實例。 它是 Kotlin 反射 API,可以處理 Kotlin 特性,如屬性、數據類等。

通過使用::class.java ,您可以獲得 Class 的實例。 它是 Java 反射 API,可與任何 Java 反射代碼互操作,但不能與某些 Kotlin 功能一起使用。

根據 Kotlin 文檔,當我們使用以下任何類類型創建對象時,引用類型將是 KClass 類型。

val c = MyClass::class  // reference type of KClass

Kotlin 類引用與 Java 類引用不同。 要獲取 Java 類引用,請使用 KClass 實例上的 .java 屬性。

val c = MyClass::class.java  // reference type of Java

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

首先,您需要了解Reflection 根據文檔:

反射是一組語言和庫功能,允許在運行時內省您自己的程序的結構。

簡而言之,它使您能夠獲取您編寫的代碼,即您定義的類名、您定義的函數名等。您編寫的所有內容,您都可以在運行時使用Reflection訪問所有這些。

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

::class給你一個KClass<T>引用, ::class.java給你Class<T>引用。 例子,

val a = MyClass::class

可以解釋為

val a = KClass<MyClass>()

注意:上面的代碼在語法上是不正確的,因為KClass是一個接口,接口不能被實例化。 這只是給你一個想法。

Class<T>類為您提供有關 T 類元數據的信息,例如它正在實現的接口、函數名稱、包名稱等。

KClassClass類似,但它提供了比Class更多的屬性(Kotlin 相關屬性)的信息。 此處列出了KClass<T>參考可為您提供的有關 T 類的所有信息https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/-k-class/#properties

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM