我有格式为-
的数据类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。
如果您想要一个具有属性
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)
}