Crear una nueva instancia de una KClass

Tengo una class Kotlin cuyo constructor primario (y único) está vacío.

Tengo una reference a esta class:

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

¿Cómo creo una instancia de esta class usando reflexión?

En Java, haría myClass.newInstance() pero parece que en Kotlin necesito encontrar primero el constructor:

 kClass.constructors.first().call() 

He visto mencionar a primaryConstructor en algunos informes de errores, pero no aparece en mi IDE.

En su caso, la reflexión de Java podría ser suficiente: puede usar MyClass::class.java y crear una nueva instancia de la misma manera que lo haría con la reflexión de Java (consulte la respuesta de @IngoKegel ).

Pero en caso de que haya más de un constructor y realmente necesite get el primario (no el pnetworkingeterminado no-arg), use la function de extensión primaryConstructor de una KClass<T> . Es parte de la reflexión de Kotlin , que no se envía dentro de kotlin-stdlib .

Para usarlo, debes agregar kotlin-reflect como una dependencia, por ejemplo, un proyecto de Gradle:

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

Suponiendo que exista ext.kotlin_version , de lo contrario reemplace $kotlin_version con la versión que use.

Entonces podrá usar primaryConstructor , por ejemplo:

 fun <T : Any> construct(kClass: KClass<T>): T? { val ctor = kClass.primaryConstructor return if (ctor != null && ctor.parameters.isEmpty()) ctor.call() else null } 

Puede usar la class Java para crear una nueva instancia:

 MyClass::class.java.newInstance() 
  • La delegación de propiedad kotlin alias lanza Exception
  • Implementando una interfaz de kotlin en java
  • java.lang.IllegalArgumentException: Callable espera 4 arguments, pero se proporcionaron 3
  • Kotlin language obtiene class en time de ejecución
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • Llamadas a function de logging usando reflexión en kotlin
  • instancia :: class.java vs. instance.javaClass
  • Acceda al tipo de delegado de Kotlin sin una instancia
  • Configurar la reflexión de kotlin, class.java no funciona
  • Obtén la function por nombre dinámicamente en Kotlin
  • Determinar si una instancia es una instancia de una class de datos