欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解kotlin中::雙冒號(hào)的使用

 更新時(shí)間:2023年04月14日 15:17:56   作者:不入流Android開發(fā)  
在?Kotlin?中?,?::?雙冒號(hào)操作符?的作用是獲取類,對(duì)象,函數(shù),屬性的?類型對(duì)象引用,這篇文章主要介紹了詳解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)文章

最新評(píng)論