2016-11-18 120 views
6

我有一個Kotlin類,它的主(且唯一)構造函數爲空。創建KClass的新實例

我有這個類的引用:

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

如何創建使用反射這個類的一個實例?

在Java中,我會做myClass.newInstance()但似乎在科特林我需要先找到構造函數:

kClass.constructors.first().call() 

我在some bug reports看到primaryConstructor提及,但它沒有出現在我的IDE起來。

回答

6

在你的情況,Java反射機制可能就足夠了:你可以使用MyClass::class.java並以同樣的方式創建一個新的實例,你會與Java反思(見@IngoKegel的答案)。

但是,如果有多個構造函數,並且您確實需要獲取主構造函數(而不是默認的無參數),請使用KClass<T>primaryConstructor擴展函數。它是Kotlin reflection的一部分,不在kotlin-stdlib內發貨。

要使用它,您必須添加kotlin-reflect作爲依賴項,例如,一個在搖籃項目:

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

假設有ext.kotlin_version,否則跟你使用的版本替換$kotlin_version

然後,你將能夠使用primaryConstructor,例如:

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

如果構造需要的參數,上述方法是沒用的 –

7

您可以使用Java類來創建新實例:

MyClass::class.java.newInstance()