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() 
  • instancia :: class.java vs. instance.javaClass
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • Quiero detectar si una class JVM es una class Kotlin o no
  • Manera idiomática de invocar methods a través de la reflexión en Kotlin
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • Obtén la function por nombre dinámicamente en Kotlin
  • ¿Cómo puedo establecer una propiedad de un object complementario en Kotlin a través de la reflexión?
  • Kotlin: doble operador de colon (reflexión) sobre
  • Configurar la reflexión de kotlin, class.java no funciona
  • ¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?
  • Kotlin: ¿Cómo puedo usar la reflexión en los packages?