¿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 obtengo las funciones declaradas de una class Kotlin (KClass en M12)?
  • ¿Cómo puedo establecer una propiedad de un object complementario en Kotlin a través de la reflexión?
  • String.intern () devuelve diferentes valores en un controller JDBC
  • Crear una nueva instancia de una KClass
  • Llamadas a function de logging usando reflexión en kotlin
  • ¿Por qué == e iguales producen resultados diferentes?
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • ¿Cómo puedo get una reference a un object Kotlin por su nombre?
  • Reflexión de Kotlin: compruebe si la propiedad tiene tipo
  • Acceda al tipo de delegado de Kotlin sin una instancia