2016-11-18 4 views
6

ich eine Kotlin Klasse, deren primäre (und einzige) Konstruktor ist leer.Erstellen einer neuen Instanz eines KClass

Ich habe einen Verweis auf diese Klasse:

val kClass: KClass<MyClass> = MyClass::class 

Wie erstelle ich eine Instanz dieser Klasse mithilfe von Reflektion?

In Java würde ich myClass.newInstance() tun, aber es scheint in Kotlin muss ich zuerst den Konstruktor finden:

kClass.constructors.first().call() 

ich erwähnt primaryConstructor in some bug reports gesehen haben, aber es ist nicht angezeigt in meinem IDE auf.

Antwort

6

In Ihrem Fall könnte Java Reflexion genug sein: Sie können MyClass::class.java verwenden und eine neue Instanz in der gleichen Art und Weise erstellen, wie Sie es mit Java Reflexion (siehe @IngoKegel ‚s Antwort).

Aber wenn es mehr als einen Konstruktor gibt und Sie wirklich die primäre (nicht die Standard-no-arg) benötigen, verwenden Sie die primaryConstructor Erweiterungsfunktion von KClass<T>. Es ist ein Teil von Kotlin reflection, die nicht innerhalb von kotlin-stdlib versandt wird.

es nutzen zu können, müssen Sie kotlin-reflect als Abhängigkeit hinzufügen, zum Beispiel ein in Gradle Projekt:

dependencies { 
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"  
} 

Unter der Annahme, dass es ext.kotlin_version, sonst ersetzen $kotlin_version mit der Version, die Sie verwenden.

Dann werden Sie in der Lage sein primaryConstructor zu verwenden, zum Beispiel:

fun <T : Any> construct(kClass: KClass<T>): T? { 
    val ctor = kClass.primaryConstructor 
    return if (ctor != null && ctor.parameters.isEmpty()) 
     ctor.call() else 
     null 
} 
+0

wenn Konstruktorparameter benötigen, die oben beschriebene Weise ist nutzlos –

7

Sie die Java-Klasse verwenden können neue Instanz zu erstellen:

MyClass::class.java.newInstance() 
Verwandte Themen