You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射获取Kotlin数据类字段的默认值?

解决方案

可以通过Kotlin反射获取构造参数的默认值,再手动赋值给实例,具体说明如下:

问题根源

你用Java反射调用无参构造创建的Kotlin数据类实例,所有字段会被初始化为JVM层面的默认值(即null)。这是因为Kotlin的默认参数逻辑是编译期处理的,Java反射调用的无参构造并不会自动触发默认值赋值逻辑。而直接从实例读取属性时,得到的是已经被初始化的null,自然拿不到预设的默认值。

具体实现

借助Kotlin反射API,我们可以获取主构造函数中参数的默认值,再赋值给实例对应的属性:

import kotlin.reflect.full.primaryConstructor
import kotlin.reflect.full.memberProperties
import kotlin.reflect.KMutableProperty

// 假设你已通过反射创建实例
val instance = ABC::class.java.getDeclaredConstructor().newInstance()

// 获取类的Kotlin反射实例
val kClass = ABC::class
// 获取主构造函数
val primaryConstructor = kClass.primaryConstructor ?: error("该类不存在主构造函数")

// 遍历构造参数,为带默认值的属性赋值
primaryConstructor.parameters.forEach { param ->
    if (param.hasDefaultValue) {
        // 获取参数的默认值
        val defaultValue = param.getDefaultValue()
        // 找到对应的可变属性
        val property = kClass.memberProperties.find { it.name == param.name } as? KMutableProperty<*>
        // 为实例的属性设置默认值
        property?.setter?.call(instance, defaultValue)
    }
}

// 此时instance.third的值为"value",first和second仍为null

注意事项

  • 确保项目已引入Kotlin反射依赖(Gradle项目需添加implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}"))
  • 该方法仅适用于存在主构造函数的类,Kotlin数据类默认都会生成主构造函数
  • 仅可变属性(var)支持通过这种方式修改值,你的字段均为var,无需担心此限制

内容的提问来源于stack exchange,提问作者sanchit munjal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:08:17