【问题标题】:Call class' constructor by reflection with Kotlin使用 Kotlin 通过反射调用类的构造函数
【发布时间】:2016-04-16 13:52:46
【问题描述】:

我有以下数据类

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&lt;T&gt;cursor: Cursor Kotlin 文档说:

当我们调用一个可变参数函数时,我们可以一个接一个地传递参数,例如asList(1, 2, 3),或者,如果我们已经有一个数组并且想要将其内容传递给函数,我们使用扩展运算符(以 * 为数组前缀)

但即使使用*,我仍然收到以下异常:

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

谁能给我一些关于如何实例化我的类的提示?谢谢

【问题讨论】:

  • 你必须在这里使用扩展运算符。你如何调用createEntity
  • 我编辑了我的问题@Michael,如您所见,我使用了扩展运算符

标签: java android reflection kotlin


【解决方案1】:

调用newInstance() 方法时必须使用扩展运算符。并且createEntity() 的签名是错误的。我建议这样定义。

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

【讨论】:

  • 完美!为了返回T,我不得不强制转换返回语句
猜你喜欢
  • 2020-01-11
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多