![](/img/trans.png)
[英]What's the difference between Foo::class.java and Foo::javaClass?
[英]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 類元數據的信息,例如它正在實現的接口、函數名稱、包名稱等。
KClass
與Class
類似,但它提供了比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.