2016-04-16 16 views
4

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

+0

Sie müssen den Spread-Operator hier verwenden. Wie rufen Sie createEntity auf? – Michael

+0

Ich habe meine Frage @Michael bearbeitet und wie Sie sehen können, verwende ich den Spread-Operator – tufekoi

Antwort

5

Sie müssen den Spread-Operator verwenden, wenn Sie die Methode newInstance() aufrufen. Und die Signatur von createEntity() ist falsch. Ich würde empfehlen, es so zu definieren.

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

Perfekt! Um ein 'T' zurückzugeben, musste ich allerdings die Return-Anweisung umsetzen – tufekoi

Verwandte Themen