反射
This commit is contained in:
+70
-1
@@ -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 的常用快捷键
|
||||
|
||||
Reference in New Issue
Block a user