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() 
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • La delegación de propiedad kotlin alias lanza Exception
  • Kotlin invoke getter / setter reflexivamente
  • ¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?
  • Reflexión de Kotlin: compruebe si la propiedad tiene tipo
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • por qué SomeClass :: class es KClass <SomeClass> pero esta :: class es KClass <out SomeClass>
  • Acceda al tipo de delegado de Kotlin sin una instancia
  • ¿Cómo obtengo el valor de una propiedad con reflection?
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • Implementando una interfaz de kotlin en java