详解kotlin中::双冒号的使用

作者:不入流Android开发 时间:2022-09-04 10:17:23 

一、:: 双冒号操作符

在 Kotlin 中 , :: 双冒号操作符 的作用是 获取 类 , 对象 , 函数 , 属性 的 类型对象 引用 ;

获取的这些引用 , 并不常用 , 都是在 Kotlin 反射操作时才会用到 ;

相当于 Java 中的 反射 类的 字节码类型 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 语言中的字节码类 , java.lang.Class 是 Java 语言的字节码类 ;

下面是 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 函数执行对应的 被引用函数 ;

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

执行结果如下 :

详解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 类的一系列功能 , 包括 :

  • 获取类的简单名称

  • 获取类的完整名称

  • 创建类的实例对象

  • 获取类的成员字段和方法

  • 获取类的继承关系

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

来源:https://blog.csdn.net/m0_70749039/article/details/130069877

标签:kotlin,::,双冒号
0
投稿

猜你喜欢

  • 浅谈java安全编码指南之死锁dead lock

    2023-06-22 04:49:19
  • SpringMVC Restful风格与中文乱码问题解决方案介绍

    2021-06-12 03:15:16
  • 无法从 int? 转换为 int 运行时出现错误

    2022-01-02 08:26:11
  • Android组件TabHost实现页面中多个选项卡切换效果

    2023-03-05 22:07:35
  • C#递归应用之实现JS文件的自动引用

    2023-12-09 00:03:52
  • Spring Boot假死诊断实战记录

    2022-02-11 17:03:38
  • Android绘制验证码的实例代码

    2023-10-30 13:57:15
  • Java套接字(Socket)网络编程入门

    2022-09-22 16:19:56
  • Kotlin全局捕捉协程异常方法详解

    2022-10-09 23:27:03
  • Java如何把int类型转换成byte

    2023-03-13 11:12:39
  • 详解SpringBoot项目整合Vue做一个完整的用户注册功能

    2022-02-13 21:46:35
  • Android中自定义对话框(Dialog)的实例代码

    2022-01-19 06:10:38
  • 自定义log4j日志文件命名规则说明

    2021-11-21 16:55:51
  • Spring Boot中操作使用Redis实现详解

    2023-11-24 02:39:29
  • ListView的View回收引起的checkbox状态改变监听等问题解决方案

    2023-07-26 17:33:45
  • winform获取当前名称实例汇总

    2023-03-22 17:03:18
  • c#消息提示框messagebox的详解及使用

    2022-06-25 14:57:44
  • C#实现窗体抖动的两种方法

    2021-10-06 10:20:52
  • 关于MyBaties的基本配置标签总结

    2022-08-09 17:28:44
  • java控制台输出图书馆管理系统

    2022-06-13 01:29:29
  • asp之家 软件编程 m.aspxhome.com