创建KClass的新实例

问题描述 投票:13回答:2

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

我引用了这个类:

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

如何使用反射创建此类的实例?

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

kClass.constructors.first().call()

我在primaryConstructor中看到过some bug reports的提及,但它并没有出现在我的IDE中。

reflection kotlin
2个回答
14
投票

在您的情况下,Java反射可能就足够了:您可以使用MyClass::class.java并以与使用Java反射相同的方式创建新实例(请参阅@IngoKegel的答案)。

但是如果有多个构造函数并且您确实需要获取主要构造函数(而不是默认的无参数),请使用primaryConstructorKClass<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
}

15
投票

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

MyClass::class.java.newInstance()
© www.soinside.com 2019 - 2024. All rights reserved.