From db12302f46ee627377be91e213fcf15fde2dd0a7 Mon Sep 17 00:00:00 2001 From: SOR <3272194354@qq.com> Date: Mon, 21 Sep 2026 19:44:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8D=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Learning/深入Kotlin.md | 71 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/Learning/深入Kotlin.md b/Learning/深入Kotlin.md index 9222bf0..408c64a 100644 --- a/Learning/深入Kotlin.md +++ b/Learning/深入Kotlin.md @@ -389,12 +389,80 @@ println(localDateTime.dayOfWeek) // SATURDAY 这是一个枚举类 DayOfWeek ### 拿到类变量 +Kotlin 类变量的类型是 `KClass`,可以通过一个类的类名直接得到,例如 + ```kotlin +val c = MyClass::class +val javaClass = MyClass::class.java ``` -### 利用类变量修改对象 +也可以通过实际变量拿到精确类名: ```kotlin +val a: Number = 1 // Int 是 Number 子类 +println(a::class.qualifiedName) // kotlin.Int +``` + +### 利用类变量获得 / 修改对象 + +```kotlin +var x = 1 + +fun main() { + println(::x.get()) // 1 + println(::x.name) // x + ::x.set(2) // 将它设为 2 +} +``` + +这里 `::x` 引用到的是本类中的 `x` 变量,也就是说如果 `x` 定义在函数 `main` 中,就不能这么引用了。注意,只有可变变量才能用 `set()`,除非使用 `Java 反射`强行更改。Kotlin 反射不推荐如此操作。 + +### 复杂类反射 + +```kotlin +class A(val p: Int) + +val a = A(1) +val prop = A::p +println(prop.get(a)) // 1 + +// 也可以拿到它的 Java 定义。 +println(A::p.javaGetter) // public final int A.getP() +println(A::p.javaField) // private final int A.p +``` + +通过这种方法,可以拿到一个类对象的一个变量值。 + +```kotlin +val lambda = ::A // 拿到类 A 的无参构造函数 +``` + +这个 lambda 相当于 A(),如果 A 的构造函数必须有参数(有默认值的话算作可以没有参数)。那么 lambda 是不能调用的。 + +```kotlin +class Person(val name: String, age: Int) +val kClass = Person::class + +val constructor = kClass.primaryConstructor // 这是主构造函数,是第一个被定义的,而且可以填入参数 + +// 这样,你可以拿到它的全部构造函数 +for (constructor in kClass.constructors) { + val parameters = constructor.parameters // 获取构造函数的参数列表 + if (parameters.size == 2) { + val instance = constructor.call("李四", 20) + break + } +} +``` + +这里的 parameters 是一个列表,它里面的元素是用来描述构造函数的每一个参数的: + +```kotlin +println("参数位置: ${param.index}") +println("参数名称: ${param.name}") +println("参数类型: ${param.type}") +println("是否为可选参数(有默认值): ${param.isOptional}") +println("是否为可变长参数: ${param.isVararg}") ``` ## 定义一个特殊的变量/函数名 @@ -404,6 +472,7 @@ println(localDateTime.dayOfWeek) // SATURDAY 这是一个枚举类 DayOfWeek ```kotlin fun `fun`() = "fun" // 例如定义一个函数 val `this` = 1 // 或是一个变量 +val `or write a sentence` = true ``` ## IDEA 的常用快捷键