我有一个Kotlin类,它的主(也是唯一的)构造函数是空的。
我有一个关于这个类的参考:
val kClass: KClass<MyClass> = MyClass::class
如何使用反射创建此类的示例?
在Java中,我会执行myClass.newInstance()
,但在Kotlin中,我似乎需要先找到构造函数:
kClass.constructors.first().call()
我在some bug reports中看到提到了primaryConstructor
,但它没有显示在我的IDE中。
5条答案
按热度按时间6jjcrrmo1#
在这种情况下,Java反射可能就足够了:你可以使用
MyClass::class.java
并创建一个新的示例,就像你使用Java反射一样(见@IngoKegel的回答)。但是如果有多个构造函数,并且您确实需要获取主构造函数(而不是默认的无参数构造函数),请使用
KClass<T>
的primaryConstructor
扩展函数。它是Kotlin reflection的一部分,kotlin-stdlib
中没有提供。要使用它,您必须添加
kotlin-reflect
作为依赖项,例如Gradle项目中的a:假设有
ext.kotlin_version
,否则用您使用的版本替换$kotlin_version
。然后你可以使用
primaryConstructor
,例如:1wnzp6jl2#
您可以使用Java类创建新示例:
bqjvbblv3#
对于那些现在检查这个问题的人,从Kotlin1.1开始,
KClass
上也有createInstance()
扩展方法与可接受的答案非常相似,此函数仅在类具有空构造函数或具有所有默认参数的构造函数的情况下才起作用。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect.full/create-instance.html
scyqe7ek4#
扩展Alexeys Answer,以包含带参数的主构造函数调用:
huwehgph5#
我喜欢hotkey的答案,但我无法让他的primaryConstructor代码示例工作。我确实让以下代码工作: