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() 
  • ¿Cómo obtengo el valor de una propiedad con reflection?
  • Cómo acceder a los objects-miembros de una statement de object en kotlin
  • Interoperabilidad de reflexión de Kotlin con Java
  • por qué SomeClass :: class es KClass <SomeClass> pero esta :: class es KClass <out SomeClass>
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz
  • ¿Cómo uso el object Kotlin por reflexión?
  • ¿Cómo obtengo una KProperty1 de una KProperty0?
  • ¿Cómo get una KClass de Array?
  • Acceda al tipo de delegado de Kotlin sin una instancia
  • ¿Cómo puedo get el nombre de una propiedad de Kotlin?