反射 API
NovaLang 运行时反射能力
反射 API
NovaLang 提供运行时反射 API,可以在运行时查询类、方法、字段的信息。
classOf()
获取类的元信息:
class User(val name: String, var age: Int) {
fun greet(): String = "Hello, $name!"
}
val info = classOf(User)
println(info.name()) // "User"
println(info.fields()) // 字段列表
println(info.methods()) // 方法列表
ClassInfo
| 方法 | 返回值 | 说明 |
|---|---|---|
name() | String | 类名 |
fields() | List | 所有字段信息 |
methods() | List | 所有方法信息 |
constructors() | List | 构造器信息 |
annotations() | List | 类上的注解 |
hasAnnotation(name) | Boolean | 是否有指定注解 |
superclass() | ClassInfo? | 父类信息 |
interfaces() | List | 实现的接口 |
FieldInfo
val info = classOf(User)
for (field in info.fields()) {
println("${field.name()}: ${field.type()}, mutable=${field.isMutable()}")
}
// name: String, mutable=false
// age: Int, mutable=true
| 方法 | 说明 |
|---|---|
name() | 字段名 |
type() | 类型名 |
isMutable() | 是否可变 (var) |
getValue(obj) | 获取字段值 |
setValue(obj, value) | 设置字段值 (仅 var) |
annotations() | 字段上的注解 |
MethodInfo
val info = classOf(User)
for (method in info.methods()) {
val params = method.params().map { "${it.name()}: ${it.type()}" }
println("${method.name()}(${params.joinToString(", ")}): ${method.returnType()}")
}
// greet(): String
实用示例
对象转 Map
fun toMap(obj: Any): Map {
val info = classOf(obj)
val result = mutableMapOf()
for (field in info.fields()) {
result.put(field.name(), field.getValue(obj))
}
return result
}
val user = User("Alice", 30)
println(toMap(user)) // {name=Alice, age=30}
对象复制
fun copy(obj: Any): Any {
val info = classOf(obj)
val args = info.fields().map { it.getValue(obj) }
return info.constructors()[0].call(*args)
}
字段比较
fun diff(a: Any, b: Any): List {
val info = classOf(a)
return info.fields()
.filter { it.getValue(a) != it.getValue(b) }
.map { "${it.name()}: ${it.getValue(a)} -> ${it.getValue(b)}" }
}