詳解kotlin中::雙冒號(hào)的使用
一、:: 雙冒號(hào)操作符
在 Kotlin 中 , :: 雙冒號(hào)操作符 的作用是 獲取 類 , 對(duì)象 , 函數(shù) , 屬性 的 類型對(duì)象 引用 ;
獲取的這些引用 , 并不常用 , 都是在 Kotlin 反射操作時(shí)才會(huì)用到 ;
相當(dāng)于 Java 中的 反射 類的 字節(jié)碼類型 Class 類型 , 對(duì)象的類型 Class 類型 , 對(duì)象的函數(shù) Method 類型 , 對(duì)象的屬性字段 Field 類型 ;
1、獲取類的引用
在 Kotlin 中 , 使用 :: 雙冒號(hào)操作符 獲取 類的類型對(duì)象引用 代碼格式為 :
Java或Kotlin類名::class
獲取的 Kotlin 類 的 類型對(duì)象 的類型 為 KClass<類名> , 如 : 獲取 String 字符串類型的引用 , 代碼為 :
String::class
獲取的 String 類的引用類型 為 KClass ,
代碼示例 : 下面的代碼中 , 通過(guò) Student::class 獲取的 引用對(duì)象的類型 是 KClass ;
import kotlin.reflect.KClass class Student { var name = "Tom" var age = 18 fun info() { println("$name is $age years old") } } fun main() { val studentClassRef: KClass<Student> = Student::class }
引用類型 KClass 說(shuō)明
Kotlin 中 類的引用類型 KClass 中 提供了很多有用的屬性 , 如 :
- public actual val simpleName: String? 屬性可以獲取類的簡(jiǎn)單名稱 ;
- public val qualifiedName: String? 屬性可以獲取類的完整名稱 ;
kotlin.reflect.KClass 是 Kotlin 語(yǔ)言中的字節(jié)碼類 , java.lang.Class 是 Java 語(yǔ)言的字節(jié)碼類 ;
下面是 KClass 的原型 , 省略了后面的代碼 ;
package kotlin.reflect /** * 表示一個(gè)類并提供內(nèi)省功能。 * 此類的實(shí)例可通過(guò) `::class` 語(yǔ)法獲得。 * 更多信息請(qǐng)參見 * [Kotlin 語(yǔ)言文檔] * (https://kotlinlang.org/docs/reference/reflection.html#class-references)。 * * @param T 類的類型。 */ public actual interface KClass<T : Any> : KDeclarationContainer, KAnnotatedElement, KClassifier { /** * 類在源代碼中聲明的簡(jiǎn)單名稱, * 如果該類沒有名稱(例如,它是一個(gè)匿名對(duì)象文字), * 則為 `null`。 */ public actual val simpleName: String? /** * 類的全限定名稱,以點(diǎn)分隔符分隔, * 如果該類是本地類或匿名對(duì)象文字,則為 `null`。 */ public val qualifiedName: String? }
2、獲取對(duì)象類型的引用
在 Kotlin 中 , 使用 :: 雙冒號(hào)操作符 獲取 對(duì)象類型的引用 代碼格式為 :
Java或Kotlin實(shí)例對(duì)象::class
獲取的 對(duì)象類型的引用 的類型 為 KClass<out 類名> , 如 : 獲取 String 字符串類型的引用 , 代碼為 :
"Tom"::class
獲取的 String 對(duì)象類型的引用 類型 為 KClass ,
在某種程度上 , 可以理解為 類的引用 等同于 對(duì)象的引用 ;
代碼示例 : 下面的代碼中 , 通過(guò) var student: Student = Student() 實(shí)例對(duì)象 , 獲取的 引用對(duì)象類型的類型 是 KClass ;
import kotlin.reflect.KClass
class Student { var name = "Tom" var age = 18 fun info() { println("$name is $age years old") } } fun main() { var student: Student = Student() val studentObjectRef: KClass<out Student> = student::class }
3、獲取函數(shù)的引用
調(diào)用 類名::函數(shù)名 獲取的 函數(shù)類型 引用 , 其類型是函數(shù)類型的 , 如下代碼中 ,
調(diào)用 Student::info 獲取的函數(shù)類型變量 的 類型為 (Student) -> Unit , 該函數(shù)引用 可以直接調(diào)用 invoke 函數(shù)執(zhí)行對(duì)應(yīng)的 被引用函數(shù) ;
class Student { var name = "Tom" var age = 18 fun info() { println("$name is $age years old") } } fun main() { var student: Student = Student() var studentInfo: (Student) -> Unit = Student::info studentInfo.invoke(student) }
執(zhí)行結(jié)果如下 :
4、獲取屬性的引用
如下代碼中 , 使用 Student::name 代碼 , 獲取 Student 類的 name 屬性類型為 KMutableProperty1<Student, String> , 獲取到該 name 屬性的引用 , 相當(dāng)于 Java 反射中的 Field 對(duì)象 , 調(diào)用 KMutableProperty1#get 函數(shù) 傳入 Student 實(shí)例對(duì)象 , 可以獲取該實(shí)例對(duì)象的 name 屬性 ;
import kotlin.reflect.KMutableProperty1 class Student { var name = "Tom" var age = 18 fun info() { println("$name is $age years old") } } fun main() { var student: Student = Student() var studentName: KMutableProperty1<Student, String> = Student::name println(studentName.get(student)) }
二、 java.lang.Class 與 kotlin.reflect.KClass
KClass 是 Kotlin 類的 引用類型 , 是 Kotlin 類的實(shí)例對(duì)象 , 通過(guò) 類名::class 可以獲取 KClass 引用 ;
KClass 提供了關(guān)于 Kotlin 類的一系列功能 , 包括 :
- 獲取類的簡(jiǎn)單名稱
- 獲取類的完整名稱
- 創(chuàng)建類的實(shí)例對(duì)象
- 獲取類的成員字段和方法
- 獲取類的繼承關(guān)系
KClass 的全類名是 kotlin.reflect.KClass , Class 的全類名是 java.lang.Class ;
與 KClass 相對(duì)的是 Java 中的 Class 類 , 是 Java 中的 類的 引用類型 ;
- 在 Java 語(yǔ)言中 , 需要通過(guò) 類名.class 獲取 Class 實(shí)例對(duì)象 ;
- 在 Kotlin 語(yǔ)言中 , 需要通過(guò)類名::class.java 獲取 Class 實(shí)例對(duì)象 ;
Class 提供了關(guān)于 Java 類的一系列功能 , 包括 :
- 獲取類的 注解
- 獲取類的 繼承關(guān)系
- 獲取類的 成員字段和方法
代碼示例 :
import kotlin.reflect.KClass import kotlin.reflect.KProperty0 import kotlin.reflect.KProperty1 class Student { var name = "Tom" var age = 18 fun info() { println("$name is $age years old") } } fun main() { // Student 實(shí)例對(duì)象 var student: Student = Student() // kotlin.reflect.KClass var kClazz: KClass<Student> = Student::class // kotlin.reflect.KClass var studentClazz: KClass<out Student> = student::class // java.lang.Class var javaClass: Class<Student> = Student::class.java // java.lang.Class var studentJavaClazz: Class<out Student> = student::class.java // KProperty1<Student, Class<Student>> var javaClass2: KProperty1<Student, Class<Student>> = Student::javaClass // KProperty0<Class<Student>> var studentJavaClass2: KProperty0<Class<Student>> = student::javaClass
到此這篇關(guān)于kotlin中,::雙冒號(hào)的使用詳解的文章就介紹到這了,更多相關(guān)kotlin::雙冒號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android利用方向傳感器獲得手機(jī)的相對(duì)角度實(shí)例說(shuō)明
下面以實(shí)例向大家介紹喜愛Android利用方向傳感器獲得手機(jī)的相對(duì)角度,不了解的朋友可以參考下2013-06-06Convert WebP to PNG using java
本文主要介紹Convert WebP to PNG using java,這里對(duì) WebP 做了詳細(xì)說(shuō)明,并講解Linux 環(huán)境下WebP 轉(zhuǎn)png格式的示例,有興趣的小伙伴可以參考下2016-08-08使用OkHttp包在Android中進(jìn)行HTTP頭處理的教程
HTTP頭部處理是HTTP網(wǎng)絡(luò)編程中的基本操作,安卓中使用OkHttp包(github.com/square/okhttp)進(jìn)行相關(guān)操作當(dāng)然也是得心應(yīng)手,這里我們就來(lái)看一下使用OkHttp包在Android中進(jìn)行HTTP頭處理的教程2016-07-07一文帶你搞清楚Android游戲發(fā)行切包資源ID那點(diǎn)事
這篇文章主要介紹了Android 解決游戲發(fā)行切包資源ID的一些問題,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2023-05-05Android實(shí)現(xiàn)購(gòu)物車添加商品特效
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)購(gòu)物車添加商品特效,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android中使用findViewByMe提升組件查找效率
本文主要介紹了Android中使用findViewByMe提升組件查找效率的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03Android編程設(shè)計(jì)模式之觀察者模式實(shí)例詳解
這篇文章主要介紹了Android編程設(shè)計(jì)模式之觀察者模式,結(jié)合實(shí)例形式詳細(xì)分析了Android觀察者模式的概念、功能、實(shí)現(xiàn)方法及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2017-12-12