我有一个Kotlin类,其主要(也是唯一的)构造函数为空。
我引用了这个类:
val kClass: KClass<MyClass> = MyClass::class
如何使用反射创建此类的实例?
在Java中我会做myClass.newInstance()
但是在Kotlin中我似乎需要先找到构造函数:
kClass.constructors.first().call()
我在primaryConstructor
中看到过some bug reports的提及,但它并没有出现在我的IDE中。
在您的情况下,Java反射可能就足够了:您可以使用MyClass::class.java
并以与使用Java反射相同的方式创建新实例(请参阅@IngoKegel的答案)。
但是如果有多个构造函数并且您确实需要获取主要构造函数(而不是默认的无参数),请使用primaryConstructor
的KClass<T>
扩展函数。它是Kotlin reflection的一部分,不在kotlin-stdlib
内发货。
要使用它,您必须添加kotlin-reflect
作为依赖项,例如在Gradle项目中:
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
}
您可以使用Java类创建新实例:
MyClass::class.java.newInstance()