2016-11-18 123 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()