Kotlin invoke getter / setter reflexivamente

Principiante en Kotlin aquí.

Intento crear y poblar objects por reflexión en un progtwig. No puedo encontrar la funcionalidad equivalente en kotlin puro así que mi solución se parece al código que funciona bien, pero requiere el uso de references sucias como java.lang.String::class.java e intelliJ, comprensiblemente, no parece gustarle esto . ¿Hay alguna manera más simple de que me falta hacer esto?

 val jclass = myObject::class.java val setters = jclass.declanetworkingMethods.filter { it.name.startsWith("set") } for (s in setters) { val paramType = s.parameterTypes.first() val data = when(paramType) { java.lang.Integer::class.java -> foo java.lang.Double::class.java -> bar java.lang.String::class.java -> baz } s.invoke(myObject, data) } 

Puede usar la reflexión de Kotlin, que requiere que agregue kotlin-reflect como una dependencia de su proyecto.

Aquí puede encontrar kotlin-reflect para Kotlin 1.0.5 , o elegir otra versión si usa una versión diferente de Kotlin.

Después de eso, puede volver a escribir su código de la siguiente manera:

 val properties = myObject.javaClass.kotlin.memberProperties for (p in properties.filterIsInstance<KMutableProperty<*>>()) { val data = when (p.returnType.javaType) { Int::class.javaPrimitiveType, Int::class.javaObjectType -> foo Double::class.javaPrimitiveType, Double::class.javaObjectType -> bar String::class.java -> baz else -> null } if (data != null) p.setter.call(myObject, data) } 

Algunos detalles:

  • A pesar de usar la reflexión de Kotlin, este enfoque también funciona con las classs de Java, sus campos y sus accesorios se verán como properties, como se describe aquí .

  • Al igual que con la reflexión de Java, memberProperties devuelve properties public de este tipo y todos sus supertypes. Para get todas las properties declaradas en el tipo (incluidas las private , pero no las de los supertypes), use declanetworkingMemberProperties lugar.

  • .filterIsInstance<KMutableProperty<*> devuelve solo las properties mutables, para que pueda usar su p.setter más tarde. Si necesita iterar sobre los captadores de todas las properties, elimínelo.

  • En el bloque when , p.returnType.javaType con Int::class.javaPrimitiveType e Int::class.javaObjectType , porque lo que es Int en Kotlin se puede asignar a Java int o java.lang.Integer dependiendo de su uso. En Kotlin 1.1, será suficiente con comprobar p.returnType.classifier == Int::class .

  • Determinar si una instancia es una instancia de una class de datos
  • ¿Cómo get un KType en Kotlin?
  • ¿Cómo establecer el valor de propiedad delegada por reflexión en kotlin?
  • Crear una nueva instancia de una KClass
  • Implementando una interfaz de kotlin en java
  • Kotlin obtiene la anotación de campo siempre vacía
  • Kotlin: ¿Es aquí una forma inteligente de lanzar NotImplementedError para todos los methods de una class?
  • kotlin reflexión verificación nullable types
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • ¿Cómo uso el object Kotlin por reflexión?