您好,登錄后才能下訂單哦!
這篇文章主要介紹“kotlin中::雙冒號如何使用”,在日常操作中,相信很多人在kotlin中::雙冒號如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”kotlin中::雙冒號如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在 Kotlin 中 , :: 雙冒號操作符 的作用是 獲取 類 , 對象 , 函數 , 屬性 的 類型對象 引用 ;
獲取的這些引用 , 并不常用 , 都是在 Kotlin 反射操作時才會用到 ;
相當于 Java 中的 反射 類的 字節(jié)碼類型 Class 類型 , 對象的類型 Class 類型 , 對象的函數 Method 類型 , 對象的屬性字段 Field 類型 ;
在 Kotlin 中 , 使用 :: 雙冒號操作符 獲取 類的類型對象引用 代碼格式為 :
Java或Kotlin類名::class
獲取的 Kotlin 類 的 類型對象 的類型 為 KClass<類名> , 如 : 獲取 String 字符串類型的引用 , 代碼為 :
String::class
獲取的 String 類的引用類型 為 KClass ,
代碼示例 : 下面的代碼中 , 通過 Student::class 獲取的 引用對象的類型 是 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 說明
Kotlin 中 類的引用類型 KClass 中 提供了很多有用的屬性 , 如 :
public actual val simpleName: String? 屬性可以獲取類的簡單名稱 ;
public val qualifiedName: String? 屬性可以獲取類的完整名稱 ;
kotlin.reflect.KClass 是 Kotlin 語言中的字節(jié)碼類 , java.lang.Class 是 Java 語言的字節(jié)碼類 ;
下面是 KClass 的原型 , 省略了后面的代碼 ;
package kotlin.reflect /** * 表示一個類并提供內省功能。 * 此類的實例可通過 `::class` 語法獲得。 * 更多信息請參見 * [Kotlin 語言文檔] * (https://kotlinlang.org/docs/reference/reflection.html#class-references)。 * * @param T 類的類型。 */ public actual interface KClass<T : Any> : KDeclarationContainer, KAnnotatedElement, KClassifier { /** * 類在源代碼中聲明的簡單名稱, * 如果該類沒有名稱(例如,它是一個匿名對象文字), * 則為 `null`。 */ public actual val simpleName: String? /** * 類的全限定名稱,以點分隔符分隔, * 如果該類是本地類或匿名對象文字,則為 `null`。 */ public val qualifiedName: String? }
在 Kotlin 中 , 使用 :: 雙冒號操作符 獲取 對象類型的引用 代碼格式為 :
Java或Kotlin實例對象::class
獲取的 對象類型的引用 的類型 為 KClass<out 類名> , 如 : 獲取 String 字符串類型的引用 , 代碼為 :
"Tom"::class
獲取的 String 對象類型的引用 類型 為 KClass ,
在某種程度上 , 可以理解為 類的引用 等同于 對象的引用 ;
代碼示例 : 下面的代碼中 , 通過 var student: Student = Student() 實例對象 , 獲取的 引用對象類型的類型 是 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 }
調用 類名::函數名 獲取的 函數類型 引用 , 其類型是函數類型的 , 如下代碼中 ,
調用 Student::info 獲取的函數類型變量 的 類型為 (Student) -> Unit , 該函數引用 可以直接調用 invoke 函數執(zhí)行對應的 被引用函數 ;
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í)行結果如下 :
如下代碼中 , 使用 Student::name 代碼 , 獲取 Student 類的 name 屬性類型為 KMutableProperty1<Student, String> , 獲取到該 name 屬性的引用 , 相當于 Java 反射中的 Field 對象 , 調用 KMutableProperty1#get 函數 傳入 Student 實例對象 , 可以獲取該實例對象的 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)) }
KClass 是 Kotlin 類的 引用類型 , 是 Kotlin 類的實例對象 , 通過 類名::class 可以獲取 KClass 引用 ;
KClass 提供了關于 Kotlin 類的一系列功能 , 包括 :
獲取類的簡單名稱
獲取類的完整名稱
創(chuàng)建類的實例對象
獲取類的成員字段和方法
獲取類的繼承關系
KClass 的全類名是 kotlin.reflect.KClass , Class 的全類名是 java.lang.Class ;
與 KClass 相對的是 Java 中的 Class 類 , 是 Java 中的 類的 引用類型 ;
在 Java 語言中 , 需要通過 類名.class 獲取 Class 實例對象 ;
在 Kotlin 語言中 , 需要通過類名::class.java 獲取 Class 實例對象 ;
Class 提供了關于 Java 類的一系列功能 , 包括 :
獲取類的 注解
獲取類的 繼承關系
獲取類的 成員字段和方法
代碼示例 :
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 實例對象 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
到此,關于“kotlin中::雙冒號如何使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。