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.

  • Determinar si una instancia es una instancia de una class de datos
  • String.intern () devuelve diferentes valores en un controller JDBC
  • Acceda al tipo de delegado de Kotlin sin una instancia
  • Configurar la reflexión de kotlin, class.java no funciona
  • Kotlin: ¿Cómo puedo usar la reflexión en los packages?
  • ¿Cómo get una KClass de Array?
  • Kotlin: isAssignableFrom y reflexiones del tipo de reflexión
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • El operador de Kotlin Reflection obtiene la implementación
  • ¿Puedo usar kotlin.reflect para get un valor de un campo
  • Llamadas a function de logging usando reflexión en kotlin