This commit is contained in:
SOR
2026-09-21 19:44:59 +08:00
parent 2e1ed5a070
commit db12302f46
+70 -1
View File
@@ -389,12 +389,80 @@ println(localDateTime.dayOfWeek) // SATURDAY 这是一个枚举类 DayOfWeek
### 拿到类变量
Kotlin 类变量的类型是 `KClass<T>`,可以通过一个类的类名直接得到,例如
```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 的常用快捷键