创建KClass的新实例

时间:2016-11-18 08:56:41

标签: reflection kotlin

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

我引用了这个类:

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

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

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

kClass.constructors.first().call()

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

3 个答案:

答案 0 :(得分:15)

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

MyClass::class.java.newInstance()

答案 1 :(得分: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
}

答案 2 :(得分:1)

对于那些现在检查此问题的人,自Kotlin 1.1以来,createInstance()上还有KClass扩展方法

类似于接受的答案,此函数仅在类具有空构造函数或具有所有默认参数的构造函数的情况下起作用。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect.full/create-instance.html