Создание нового экземпляра KClass

У меня есть класс Kotlin, основной (и единственный) конструктор пуст.

У меня есть ссылка на этот класс:

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

Как создать экземпляр этого класса с помощью отражения?

В Java я бы сделал myClass.newInstance(), но, похоже, в Kotlin мне нужно сначала найти конструктор:

kClass.constructors.first().call()

Я уже упоминал primaryConstructor в некоторые сообщения об ошибках, но он не отображается в моей среде IDE.

Ответ 1

В вашем случае рефлексии Java может быть достаточно: вы можете использовать MyClass::class.java и создать новый экземпляр точно так же, как и при рефлексии Java (см. @IngoKegel answer).

Но если имеется более одного конструктора и вам действительно нужно получить основной (не стандартный по умолчанию), используйте функцию расширения primaryConstructor extension function of a KClass<T>. Это часть отражения Котлина, которая не поставляется в kotlin-stdlib.

Чтобы использовать его, вы должны добавить kotlin-reflect в качестве зависимости, например, проект в Gradle:

dependencies {
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"    
}

Assuming that there is [TG46], otherwise replace [TG47] with the version you use.

Тогда вы сможете использовать 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

Вы можете использовать класс Java для создания нового экземпляра:

MyClass::class.java.newInstance()

Ответ 3

Для тех, кто сейчас проверяет этот вопрос, начиная с Kotlin 1.1, также есть метод расширения createInstance() на KClass

Как и принятый ответ, эта функция работает только в том случае, если у класса есть пустой конструктор или конструктор со всеми аргументами по умолчанию.

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