如何使用反射获取数据类中定义的字段的默认值?

问题描述 投票:0回答:1

我有格式为-

的数据类
data class ABC(
    var first: String,
    var second: String,
    var third: String = "value"
) 

我正在使用以下方法来创建实例

T::class.java.getDeclaredConstructor().newInstance()

现在,此方法调用空构造函数并创建一个实例,其值第一个为

null
,第二个为
null
,第三个为
null
,即使这些是不可为 null 的字段。

我想要的是创建一个实例,其值第一个为

null
,第二个为
null
,第三个为
value

有什么方法可以在创建实例后获取默认值,然后手动设置这些值吗?

我尝试直接获取类的成员属性,但要调用该属性并获取必须传递实例的值。如果我传递使用上述方法创建的实例,我将得到 Third 的值为 null。

kotlin reflection utility
1个回答
0
投票

如果您想要一个具有属性

ABC
null
和默认值
null
"value"
实例,您首先需要声明构造函数以允许可为 null 的属性:

data class ABC(
    var first: String?,
    var second: String?,
    var third: String = "value"
)

我强烈建议您考虑使用

val
而不是
var
来使数据类不可变,除非您确实需要它是可变的。

使用

T::class.java
尝试是行不通的,因为Java没有默认参数的概念。您需要使用
T::class
来代替,它会返回
KClass
,它是 Kotlin 反射系统的一部分,确实理解默认参数。

要使用默认参数,您需要提供所需参数到值的映射,忽略那些您想要保留为默认值的参数:

import kotlin.reflect.full.primaryConstructor

fun main() {
    val constructor = ABC::class.primaryConstructor ?: error("missing constructor")
    val params = constructor.parameters
    val instance = constructor.callBy(mapOf(params[0] to "p1", params[1] to "p2"))
    println(instance)  // ABC(first = p1, second = p2, third = value)
}
© www.soinside.com 2019 - 2024. All rights reserved.