【发布时间】:2019-02-22 10:44:32
【问题描述】:
如果工厂方法存在,我的代码接受一个类作为参数并准备数据以调用伴随对象工厂方法的该类的构造函数。
调用构造函数时一切正常,但出现错误
java.lang.IllegalArgumentException: No argument provided for a required parameter: instance of fun nz.salect.objjson.JVMTest.StudentWithFactory.Companion.fromJson(kotlin.String, kotlin.Int): nz.salect.objjson.JVMTest.StudentWithFactory
调用工厂方法时。有问题的工厂方法:
data class StudentWithFactory(val name: String, val years: Int=0) {
companion object {
fun fromJson(name: String="", age: Int = 0):StudentWithFactory {
return StudentWithFactory(name, age)
}
}
}
没有必需的参数,除非有一些隐藏参数。有什么想法吗?
事实上,我恢复了从fromJson 中完全删除参数并使用::fromJson.callby(emptyMap()) 直接调用伴随方法。同样的错误。
很明显,伴随方法至少需要一个附加参数。也许是班级?还是伴生对象? 如何指定所需的参数?
为建立 callBy() 的函数提供了一个类(或从提供的类中查找该类)以及 json 名称和值。
var funk:KFunction<*>?=null
val companionFuncs=cls.companionObject?.declaredMemberFunctions
if(companionFuncs?.size ?:0 >0){
companionFuncs?.forEach {
if(it.name == "fromJson") funk=it
}
}
val cons:KFunction<T> = if(funk != null)
funk as KFunction<T>
else
cls.primaryConstructor ?: throw IllegalArgumentException("no primary constructor ${cls.simpleName}")
val valuesMap = cons.parameters.filter{it.name in vals}
.associateBy(
{it},
{generateValue(it)}
)
val data = cons.callBy(valuesMap) //as T
return data
【问题讨论】:
-
请提供调用工厂方法的代码。我假设你使用反射,那么默认参数将不会被使用。
-
我不是 kotlin 反射专家,但也许您需要
@JvmOverloads在您的配套工厂方法上,以便字节码中实际存在无参数方法。 -
你能提供你调用工厂方法的代码吗?我尝试直接调用工厂方法没有问题,但也许我“误解了你的问题......
-
我认为这是一个类似的问题:stackoverflow.com/questions/48175768/…
-
@Rene 我添加了调用工厂方法的代码。在提供的 json 数据中使用默认参数。
标签: reflection kotlin kotlin-companion