Ich habe folgende DatenklasseAnruf Klasse Konstruktor durch Reflexion mit Kotlin
data class Person (val id: Int? = null, val name: String, val active: Boolean)
Ich brauche es zu nennen Konstruktor durch Reflexion. Ich versuchte, den folgenden Code
private fun <T> createEntity(constructor: Constructor<*>, vararg args: T) : Any {
return constructor.newInstance(args)
}
und nennen sie mit einer Anordnung für die args
Parameter.
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)
Mit entity: Class<T>
und cursor: Cursor
aus einer lokalen Datenbank Kotlin Dokumentation sagt:
Wenn wir eine Vararg-Funktion aufrufen, können wir Argumente one-by-one passieren, z.B. asList (1, 2, 3), oder, wenn man bereits eine Anordnung haben, und wollen seinen Inhalt an die Funktion übergeben, wir die Ausbreitung Operator (Präfix das Array mit *)
Aber auch mit der *
Ich bekomme immer die folgende Ausnahme:
java.lang.IllegalArgumentException: Wrong number of arguments; expected 3, got 1
Kann jemand mir einige Tipps geben, wie man meine Klasse instanziiert? Danke
Sie müssen den Spread-Operator hier verwenden. Wie rufen Sie createEntity auf? – Michael
Ich habe meine Frage @Michael bearbeitet und wie Sie sehen können, verwende ich den Spread-Operator – tufekoi