通过与 Kotlin 的反射调用类的构造函数

2022-09-03 15:19:42

我有以下数据类

data class Person (val id: Int? = null, val name: String, val active: Boolean)

我需要通过反射将其称为构造函数。我尝试了以下代码

private fun <T> createEntity(constructor: Constructor<*>, vararg args: T) : Any {
    return constructor.newInstance(args)
}

并使用参数的数组调用它。args

val fields = entity.declaredFields
var elements = Array<Any>(getFieldsCount(fields), { i ->
    val index = cursor.getColumnIndex(fields[i].name.toUpperCase())
    when (fields[i].type) {
        kotlin.Int::class.java -> cursor.getInt(index)
        kotlin.Boolean::class.java -> if (cursor.getInt(index) == 1) true else false
        else -> cursor.getString(index)
    }

})
val test = createEntity(entity.constructors.first(), *elements)

使用和来自本地数据库 Kotlin 文档说:entity: Class<T>cursor: Cursor

当我们调用 vararg 函数时,我们可以逐个传递参数,例如 asList(1, 2, 3),或者,如果我们已经有一个数组并希望将其内容传递给函数,我们使用展开运算符(在数组前面加上 *)

但即使有我不断得到以下例外:*

java.lang.IllegalArgumentException: Wrong number of arguments; expected 3, got 1

任何人都可以给我一些关于如何实例化我的类的提示吗?谢谢


答案 1

调用该方法时,必须使用点差运算符。的签名是错误的。我建议这样定义它。newInstance()createEntity()

private fun <T> createEntity(constructor: Constructor<T>, vararg args: Any) : T {
    return constructor.newInstance(*args)
}

答案 2

推荐