创建一个KClass的新实例

我有一个Kotlin类,其主要(也是唯一的)构造函数是空的。

我有这个类的参考:

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

如何使用反射来创建这个类的实例?

在Java中我会做myClass.newInstance()但似乎在Kotlin我需要找到第一个构造函数:

 kClass.constructors.first().call() 

我在一些错误报告中看到过提到primaryConstructor ,但是它没有显示在我的IDE中。

在你的情况下,Java反射可能已经足够了:你可以使用MyClass::class.java创建一个新的实例,就像使用Java反射一样(请参阅@IngoKegel的答案)。

但是,如果有多个构造函数,并且确实需要获取主构造函数(而不是默认的no-arg),请使用KClass<T>KClass<T>扩展函数。 它是Kotlin反射的一部分,不在kotlin-stdlib内部kotlin-stdlib

要使用它,你必须添加kotlin-reflect作为依赖项,例如在Gradle项目中:

 dependencies { compile 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 } 

您可以使用Java类来创建新的实例:

 MyClass::class.java.newInstance()