Kotlin编译器是否始终保留字节码中的参数名称?

kotlin-reflect ,类KParameter具有可空name ,其KDoc表示:

该参数在源代码中声明的名称;如果参数没有名称或名称在运行时不可用,则为null 。 无名参数的例子包括用于成员函数的这个实例,用于扩展函数或属性的扩展接收器, 没有调试信息的情况下编译的Java方法的参数 等等

它讲述了众所周知的事实,即Java并不总是在字节码中包含参数名称,但它没有提到Kotlin类,尽管还有其他一些类。

我可以假设Kotlin编译器保留为Kotlin源代码中的函数声明的参数名称吗? (特别是,我需要构造函数参数名称)。

除非字节码以某种方式被修改,否则假设在源中给定名称的所有参数在运行时都会有这些名称。 对Kotlin 1.0来说这是真的,并没有计划改变这一点。

如果你感兴趣的是其他包含的未命名参数,那么还有默认属性设置器的单个参数和内部类构造器的外部类参数。 这些参数在源代码和运行时都没有名称。

UPD:因为这可能会让一些人感到困惑,所以这个问题和答案只与保留Kotlin反射的参数名有关 ,特别是KParameter.name会起作用。 这与Java反射会为编译的Kotlin代码显示的参数名称无关。 要保留Java反射的参数名称,请将-java-parameters选项传递给Kotlin编译器。

只是为了完成Alexander的回答,因为它可能并不是显而易见的, 为Kotlin类的Java反射提供参数名称 (例如对于使用反射来查看Kotlin代码的参数名称的Java代码),您必须提供-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 } } 

的IntelliJ

  1. 首选项 > Kotlin编译器 > 其他命令行参数

  2. -java-parameters附加到列表中

确保在运行任何基于反射的代码之前运行clean。