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 obtengo las funciones declaradas de una class Kotlin (KClass en M12)?
  • ¿Cómo obtengo el valor de una propiedad con reflection?
  • Acceda al tipo de delegado de Kotlin sin una instancia
  • Kotlin enlazó la incoinheritance de las references invocables
  • Implementando una interfaz de kotlin en java
  • ¿Cómo get la reference de class de KParameter en kotlin?
  • Cómo acceder a los objects-miembros de una statement de object en kotlin
  • La igualdad de class Kotlin falla
  • Crear una nueva instancia de una KClass
  • Configurar la reflexión de kotlin, class.java no funciona
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?