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

16

我有以下数据类

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)

使用本地数据库的entity: Class<T>cursor: Cursor,Kotlin文档说:

当我们调用可变参数函数时,我们可以逐个传递参数,例如asList(1, 2, 3),或者如果我们已经有一个数组并想将其内容传递给函数,则使用扩展操作符(在数组前加上*)

但是即使使用了*,我仍然收到以下异常:
java.lang.IllegalArgumentException: Wrong number of arguments; expected 3, got 1

有人能给我一些如何实例化我的类的建议吗?谢谢


你必须在这里使用扩展运算符。你如何调用 createEntity 函数? - Michael
我编辑了我的问题@Michael,正如你所看到的,我使用了扩展运算符。 - tufekoi
1个回答

12
你在调用 newInstance() 方法时必须使用展开运算符。而 createEntity() 函数的签名是错误的。我建议将其定义为以下形式。
private fun <T> createEntity(constructor: Constructor<T>, vararg args: Any) : T {
    return constructor.newInstance(*args)
}

1
完美!为了返回一个 T ,我不得不将返回语句强制转换 - tufekoi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接