这篇文章主要介绍“Kotlin中::双冒号如何使用”,在日常操作中,相信很多人在kotlin中::双冒号如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”kotlin中::双冒号如何使用”的疑惑有所帮助!
这篇文章主要介绍“Kotlin中::双冒号如何使用”,在日常操作中,相信很多人在kotlin中::双冒号如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”kotlin中::双冒号如何使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
在 Kotlin 中 , :: 双冒号操作符 的作用是 获取 类 , 对象 , 函数 , 属性 的 类型对象 引用 ;
获取的这些引用 , 并不常用 , 都是在 Kotlin 反射操作时才会用到 ;
相当于 Java 中的 反射 类的 字节码类型 Class 类型 , 对象的类型 Class 类型 , 对象的函数 Method 类型 , 对象的属性字段 Field 类型 ;
在 Kotlin 中 , 使用 :: 双冒号操作符 获取 类的类型对象引用 代码格式为 :
Java或Kotlin类名::class
获取的 Kotlin 类 的 类型对象 的类型 为 KClass<类名> , 如 : 获取 String 字符串类型的引用 , 代码为 :
String::class
获取的 String 类的引用类型 为 KClass ,
代码示例 : 下面的代码中 , 通过 Student::class 获取的 引用对象的类型 是 KClass ;
import kotlin.reflect.KClassclass 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.reflectpublic actual interface KClass<T : Any> : KDeclarationContainer, KAnnotatedElement, KClassifier { public actual val simpleName: String? 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 函数执行对应的 被引用函数 ;
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)}
执行结果如下 :
如下代码中 , 使用 Student::name 代码 , 获取 Student 类的 name 属性类型为 KMutableProperty1<Student, String> , 获取到该 name 属性的引用 , 相当于 Java 反射中的 Field 对象 , 调用 KMutableProperty1#get 函数 传入 Student 实例对象 , 可以获取该实例对象的 name 属性 ;
import kotlin.reflect.KMutableProperty1class 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 类的一系列功能 , 包括 :
获取类的简单名称
获取类的完整名称
创建类的实例对象
获取类的成员字段和方法
获取类的继承关系
KClass 的全类名是 kotlin.reflect.KClass , Class 的全类名是 java.lang.Class ;
与 KClass 相对的是 Java 中的 Class 类 , 是 Java 中的 类的 引用类型 ;
在 Java 语言中 , 需要通过 类名.class 获取 Class 实例对象 ;
在 Kotlin 语言中 , 需要通过类名::class.java 获取 Class 实例对象 ;
Class 提供了关于 Java 类的一系列功能 , 包括 :
获取类的 注解
获取类的 继承关系
获取类的 成员字段和方法
代码示例 :
import kotlin.reflect.KClassimport kotlin.reflect.KProperty0import kotlin.reflect.KProperty1class 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中::双冒号如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!
--结束END--
本文标题: kotlin中::双冒号如何使用
本文链接: https://lsjlt.com/news/357689.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0