我有以下数据类
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文档说:
当我们调用vararg函数时,我们可以逐个传递参数,例如: asList(1,2,3),或者,如果我们已经有一个数组并希望将其内容传递给函数,我们使用扩展运算符(数组前缀为*)
但即使使用*
,我仍然会遇到以下异常:
java.lang.IllegalArgumentException: Wrong number of arguments; expected 3, got 1
有人可以给我一些关于如何实例化我的课程的提示吗?感谢
答案 0 :(得分:6)
调用newInstance()
方法时必须使用spread运算符。 createEntity()
的签名是错误的。我建议像这样定义它。
private fun <T> createEntity(constructor: Constructor<T>, vararg args: Any) : T {
return constructor.newInstance(*args)
}