¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?

En kotlin-reflect , la class KParameter tiene name anulable, y su KDoc dice:

Nombre de este parámetro tal como fue declarado en el código fuente, o null si el parámetro no tiene nombre o su nombre no está disponible en time de ejecución. Los ejemplos de parameters sin nombre incluyen esta instancia para funciones miembro, receptor de extensión para funciones o properties de extensión, parameters de methods Java comstackdos sin la información de debugging, y otros .

Dice sobre el hecho bien conocido de que Java no siempre incluye nombres de parameters en bytecode, pero no dice nada sobre las classs de Kotlin, aunque hay algunos otros .

¿Puedo suponer que el comstackdor de Kotlin retiene los nombres de los parameters declarados para las funciones en las fonts de Kotlin? (En particular, necesito nombres de parameters de constructor).

A less que el bytecode se haya modificado de alguna manera, es seguro suponer que todos los parameters que tienen nombres en las fonts tendrán esos nombres en time de ejecución. Esto es cierto para Kotlin 1.0 y no hay planes para cambiar esto.

Si le interesan los parameters sin nombre que otros incluyen, también existe el parámetro único de un configurador de properties pnetworkingeterminado y el parámetro de class externo para un constructor de class interna. Dichos parameters no tienen nombres ni en el código fuente ni en el time de ejecución.

UPD: dado que esto puede parecer confuso para algunos, esta pregunta y la respuesta solo están relacionadas con la retención de nombres de parameters para la reflexión de Kotlin y específicamente para que KParameter.name funcione. Esto no está relacionado con los nombres de los parameters que la reflexión de Java vería para el código comstackdo de Kotlin. Para conservar los nombres de los parameters para la reflexión de Java, pase la opción -java-parameters al comstackdor de Kotlin.

Solo para completar la respuesta anterior de Alexander, ya que puede no ser inmediatamente obvio, para proporcionar nombres de parameters para la reflexión de Java de las classs de Kotlin (es decir, para código Java utilizando la reflexión para ver nombres de parameters del código de Kotlin), debe proporcionar el argumento -java-parameters ( desde Kotlin 1.1).

Gradle

En su build.gradle > compileKotlin closure

 compileKotlin { kotlinOptions { jvmTarget = '1.8' //Good to target Java 8 unless you need 7 javaParameters = true //Will retain parameter names for Java reflection } } 

IntelliJ

  1. En Preferences > Comstackdor Kotlin > Parámetros de línea de command adicionales

  2. Anexa -java-parameters a la list

Asegúrese de ejecutar una limpieza antes de ejecutar cualquier código basado en la reflexión.

  • ¿Cómo get una KClass de Array?
  • Kotlin: ¿Es aquí una forma inteligente de lanzar NotImplementedError para todos los methods de una class?
  • ¿Cómo uso el object Kotlin por reflexión?
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • Obteniendo la class actual
  • ¿Cómo puedo get una reference a Kotlin KClass por nombre cuando no se ejecuta en la JVM?
  • Kotlin: doble operador de colon (reflexión) sobre
  • Configurar la reflexión de kotlin, class.java no funciona
  • Implementando una interfaz de kotlin en java
  • El operador de Kotlin Reflection obtiene la implementación
  • Kotlin: ¿Cómo puedo usar la reflexión en los packages?