文档/进阶/反射 API

反射 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)}" }
}