У меня есть код принимает класс в качестве параметра и подготавливает данные для вызова конструктора для этого класса метода фабрики сопутствующих объектов, если присутствует фабричный метод.
Все прекрасно работает при вызове конструктора,но я получаю ошибку
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