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 .

  • ¿Cómo uso el object Kotlin por reflexión?
  • ¿Puedo get una KFunction de una variable del tipo de function en Kotlin?
  • ¿Cómo puedo get una reference a Kotlin KClass por nombre cuando no se ejecuta en la JVM?
  • Kotlin language obtiene class en time de ejecución
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • La igualdad de class Kotlin falla
  • ¿Cómo puedo get una reference a un object Kotlin por su nombre?
  • Kotlin: ¿Cómo puedo usar la reflexión en los packages?
  • Los literales de class Kotlin con el lado izquierdo vacío aún no son compatibles.
  • kotlin reflexión verificación nullable types
  • String.intern () devuelve diferentes valores en un controller JDBC