在 Kotlin 中使用默认参数调用反射构造函数
Call reflected constructor with default parameters in Kotlin
我正在从 json 个文件中恢复复杂数据,其中一些文件需要调用不具有空构造函数但具有默认参数的构造函数的特定类型。
有一个创建空对象的方法,
abstract class Restorer {
inline fun <reified T>load(ctx: T): T {
var that: T = reset(ctx)
// ...
}
inline fun <reified T>reset(ctx: T): T {
val primaryConstructorT = T::class.constructors.find {
it.parameters.isEmpty() || it.parameters.all { prm -> prm.isOptional }
}
return primaryConstructorT!!.call() // <--- here is a problem
}
}
所以在某些情况下 primaryConstructorT
是对具有可选参数的构造函数的反射,但直接调用它会产生异常。
Callable expects 2 arguments, but 0 were provided.
有创建简单数据的案例class
data class DataClass (val foo: List<String> = listOf(), val bar: List<Int> = listOf())
// ...
var context: DataClass? = null;
// ...
context = Restorer.load(context)
有没有调用方法
也许有更好的方法,但您可以使用 callBy() 和空地图:
return primaryConstructorT!!.callBy(emptyMap())
它会自动用默认值替换缺少的参数。
我正在从 json 个文件中恢复复杂数据,其中一些文件需要调用不具有空构造函数但具有默认参数的构造函数的特定类型。
有一个创建空对象的方法,
abstract class Restorer {
inline fun <reified T>load(ctx: T): T {
var that: T = reset(ctx)
// ...
}
inline fun <reified T>reset(ctx: T): T {
val primaryConstructorT = T::class.constructors.find {
it.parameters.isEmpty() || it.parameters.all { prm -> prm.isOptional }
}
return primaryConstructorT!!.call() // <--- here is a problem
}
}
所以在某些情况下 primaryConstructorT
是对具有可选参数的构造函数的反射,但直接调用它会产生异常。
Callable expects 2 arguments, but 0 were provided.
有创建简单数据的案例class
data class DataClass (val foo: List<String> = listOf(), val bar: List<Int> = listOf())
// ...
var context: DataClass? = null;
// ...
context = Restorer.load(context)
有没有调用方法
也许有更好的方法,但您可以使用 callBy() 和空地图:
return primaryConstructorT!!.callBy(emptyMap())
它会自动用默认值替换缺少的参数。