Interoperabilidad de reflexión de Kotlin con Java

¿Cuáles son las advertencias que un desarrollador debe tener en count al escribir código reflexivo que funciona tanto con Java como con Kotlin?

Por ejemplo, tengo una biblioteca existente que usa la reflexión y funciona bien con Java. Sin embargo, cuando uso lo mismo con Kotlin, mi código reflector no parece recoger las annotations en los campos.

Estas son algunas de las diferencias que noté.

1. Adquirir una instancia de class

// Example 1.1 - Java Class<?> userClass = User.class; // From a class name userClass = userInstance.getClass(); // OR from an instance 

Obteniendo una instancia de class Java en Kotlin

 // Example 1.2 - Kotlin val userClass = userInstance.javaClass // From an instance 

No puedo usar la installation .class o el método .getClass() en Kotlin como lo hacemos en Java.

2. Delegados

Cuando uso properties delegadas en una class Kotlin, las properties que recupero tienen el sufijo $delegate . Esto es un poco contrario a los campos que obtenemos en Java (entiendo que Kotlin no tenga campos, solo properties). ¿Cómo afecta esto la meta-progtwigción?

Sin embargo, con los delegates veo que la mayoría de los methods conservan su comportamiento como lo hacen en Java. ¿Hay alguna otra diferencia que deba tener en count?

Hacer que Java y Kotlin sean interoperables para mí requerirían una comprensión de 1 discutida anteriormente, más otras limitaciones / diferencias que Kotlin aporta a la metaprogtwigción.

Por ejemplo, tengo una biblioteca existente que usa la reflexión y funciona bien con Java. Sin embargo, cuando uso lo mismo con Kotlin, mi código reflector no parece recoger las annotations en los campos.

¿Puede ser porque los campos son privados ahora?

De todos modos, hay problemas con las annotations en los campos en este momento, esto se fijará en los próximos hitos.

Algunos otros asuntos relevantes:

No puedo usar la installation .class o el método .getClass () en Kotlin como lo hacemos en Java.

Solo la syntax es diferente: javaClass<C>() funciona exactamente igual que C.class , y x.javaClass hace lo mismo que x.getClass()

Cuando uso properties delegadas en una class Kotlin, las properties que recupero tienen el sufijo $ delegate.

Corrección secundaria: los campos tienen el sufijo $delegate , no las properties.

Sin embargo, con los delegates veo que la mayoría de los methods conservan su comportamiento como lo hacen en Java. ¿Hay alguna otra diferencia que deba tener en count?

Los documentos aquí le dan una descripción detallada de cómo se implementan las properties delegadas.

Hacer que Java y Kotlin sean interoperables para mí requerirían una comprensión de 1 discutida anteriormente, más otras limitaciones / diferencias que Kotlin aporta a la metaprogtwigción.

Cuanto más se parezca el código de Kotlin al código de Java, menor será la diferencia desde el punto de vista del reflection. Si escribe Kotlin idiomático, por ejemplo, use valores de parameters pnetworkingeterminados, rasgos, properties, delegates, funciones de nivel superior, extensiones, etc., las classs que obtiene difieren de Java idiomático, de lo contrario, están estrechamente alineadas.

  • ¿Cómo puedo establecer una propiedad de un object complementario en Kotlin a través de la reflexión?
  • Kotlin enlazó la incoinheritance de las references invocables
  • ¿Cómo get un KType en Kotlin?
  • ¿Cómo obtengo las funciones declaradas de una class Kotlin (KClass en M12)?
  • java.lang.IllegalArgumentException: Callable espera 4 arguments, pero se proporcionaron 3
  • ¿Cómo cambiar un campo de miembro con la reflexión de Kotlin?
  • Kotlin language obtiene class en time de ejecución
  • Kotlin: isAssignableFrom y reflexiones del tipo de reflexión
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz
  • ¿Por qué == e iguales producen resultados diferentes?
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?