В 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).
В вашем 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 } }
В настройках > Компилятор Kotlin > Дополнительные параметры командной строки
Добавить -java-parameters
в список
Перед запуском любого кода, основанного на отражении, убедитесь, что вы запустили чистую систему.