Компилятор Kotlin всегда сохраняет имена параметров в байт-коде?

В kotlin-reflect класс KParameter имеет name KParameter name , и его KDoc говорит:

Имя этого параметра, как оно было объявлено в исходном коде, или null если параметр не имеет имени или его имя не доступно во время выполнения. Примеры безымянных параметров включают этот экземпляр для функций-членов, расширительный приемник для функций или свойств расширения, параметры методов Java, скомпилированных без отладочной информации, и другие .

В нем говорится о хорошо известном факте, что Java не всегда включает имена параметров в байт-код, но ничего не говорит о классах Kotlin, хотя есть и другие .

Могу ли я предположить, что компилятор Kotlin сохраняет имена параметров, объявленные для функций в источниках Kotlin? (В частности, мне нужны имена параметров конструктора).

Если байт-код не был каким-то образом изменен, можно с уверенностью предположить, что все параметры, которым присвоены имена в источниках, будут иметь эти имена во время выполнения. Это справедливо для Kotlin 1.0, и нет никаких планов изменить это.

Если вам интересно, какие неназванные параметры включают другие , есть также единственный параметр установщика свойств по умолчанию и внешний параметр класса для внутреннего конструктора классов. Такие параметры не имеют имен ни в исходном коде, ни во время выполнения.

UPD: поскольку это может показаться странным для некоторых, этот вопрос и ответ связаны только с сохранением имен параметров для отражения Kotlin и, в частности, KParameter.name работы KParameter.name . Это не связано с именами параметров, которые Java-отражение увидит для скомпилированного кода Kotlin. Чтобы сохранить имена параметров для отражения Java, передайте параметр -java-parameters компилятору Kotlin.

Чтобы полностью ответить на вопрос Александра, поскольку это может быть не сразу очевидным, предоставить имена параметров для Java-отражения классов Kotlin (т.е. для Java-кода с использованием отражения для просмотра имен параметров кода Kotlin), вы должны -java-parameters аргумент -java-parameters ( так как Kotlin 1.1).

Gradle

В вашем build.gradle > compileKotlin закрытие

 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. В настройках > Компилятор Kotlin > Дополнительные параметры командной строки

  2. Добавить -java-parameters в список

Перед запуском любого кода, основанного на отражении, убедитесь, что вы запустили чистую систему.