如何通过反射获取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
相关产品推荐
相关产品推荐

