Reflection 创建KClass的新实例

Reflection 创建KClass的新实例,reflection,kotlin,Reflection,Kotlin,我有一个Kotlin类,它的主(也是唯一)构造函数是空的 我参考了这门课: val kClass: KClass<MyClass> = MyClass::class 我在中提到了primaryConstructor,但它没有出现在我的IDE中。您可以使用Java类创建新实例: MyClass::class.java.newInstance() 在您的例子中,Java反射可能就足够了:您可以使用MyClass::class.Java并以与Java反射相同的方式创建一个新实例(请参见

我有一个Kotlin类,它的主(也是唯一)构造函数是空的

我参考了这门课:

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

我在中提到了
primaryConstructor
,但它没有出现在我的IDE中。

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

MyClass::class.java.newInstance()

在您的例子中,Java反射可能就足够了:您可以使用
MyClass::class.Java
并以与Java反射相同的方式创建一个新实例(请参见的答案)

但是,如果有多个构造函数,并且确实需要获取主构造函数(而不是默认的no-arg构造函数),请使用a的扩展函数。它是的一部分,未在kotlin stdlib内装运

要使用它,您必须将其添加为依赖项,例如,在Gradle项目中:

dependencies {
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"    
}
假设存在
ext.kotlin_版本
,否则将
$kotlin_版本
替换为您使用的版本

然后您将能够使用
primaryConstructor
,例如:

fun <T : Any> construct(kClass: KClass<T>): T? {
    val ctor = kClass.primaryConstructor
    return if (ctor != null && ctor.parameters.isEmpty())
        ctor.call() else
        null
}
fun构造(kClass:kClass):T?{
val ctor=kClass.primaryConstructor
如果(ctor!=null&&ctor.parameters.isEmpty())返回
conctor.call()其他
无效的
}

对于现在检查这个问题的人来说,由于Kotlin 1.1还有
createInstance()
扩展方法在
KClass

与接受的答案非常相似,该函数仅在类具有空构造函数或具有所有默认参数的构造函数的情况下工作


如果构造函数需要参数,那么上面的方法是不可用的如果构造函数需要参数,那么推荐的方法是什么?非常有趣的是,Kotlin没有类似的简单和惯用的方法来实现这一点,
Class.newInstance()
已被弃用,因为Java 9的参数绕过了已检查的异常。这将在数据类上失败,除非手动创建构造函数。非常感谢。我不知道如何使用createInstance传递参数。怎么用?
fun <T : Any> construct(kClass: KClass<T>): T? {
    val ctor = kClass.primaryConstructor
    return if (ctor != null && ctor.parameters.isEmpty())
        ctor.call() else
        null
}