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 .

  • Quiero detectar si una class JVM es una class Kotlin o no
  • ¿Cómo get una KClass de Array?
  • Cómo acceder a los objects-miembros de una statement de object en kotlin
  • Crear una nueva instancia de una KClass
  • Kotlin: isAssignableFrom y reflexiones del tipo de reflexión
  • ¿Por qué == e iguales producen resultados diferentes?
  • ¿Cómo puedo get el nombre de una propiedad de Kotlin?
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • Kotlin obtiene la anotación de campo siempre vacía
  • ¿Cómo puedo establecer una propiedad de un object complementario en Kotlin a través de la reflexión?
  • El operador de Kotlin Reflection obtiene la implementación