溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

kotlin中::雙冒號如何使用

發(fā)布時間:2023-04-15 11:22:34 來源:億速云 閱讀:99 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“kotlin中::雙冒號如何使用”,在日常操作中,相信很多人在kotlin中::雙冒號如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”kotlin中::雙冒號如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、:: 雙冒號操作符

在 Kotlin 中 , :: 雙冒號操作符 的作用是 獲取 類 , 對象 , 函數 , 屬性 的 類型對象 引用 ;

獲取的這些引用 , 并不常用 , 都是在 Kotlin 反射操作時才會用到 ;

相當于 Java 中的 反射 類的 字節(jié)碼類型 Class 類型 , 對象的類型 Class 類型 , 對象的函數 Method 類型 , 對象的屬性字段 Field 類型 ;

1、獲取類的引用

在 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?
}

2、獲取對象類型的引用

在 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
}

3、獲取函數的引用

調用 類名::函數名 獲取的 函數類型 引用 , 其類型是函數類型的 , 如下代碼中 ,

調用 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í)行結果如下 :

kotlin中::雙冒號如何使用

4、獲取屬性的引用

如下代碼中 , 使用 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))
}

kotlin中::雙冒號如何使用

二、 java.lang.Class 與 kotlin.reflect.KClass

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>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI