创建一个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()