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

hot*_*key 4 reflection parameters kotlin

在kotlin-reflect,类KParameter可以为空name,其KDoc说:

在源代码中声明null的参数名称,或者参数没有名称或其名称在运行时不可用的名称.无名参数的示例包括用于成员函数的此实例,用于扩展函数或属性的扩展接收器,在没有调试信息的情况下编译的Java方法的参数等.

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

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

Ale*_*lov 7

除非字节码以某种方式被修改,否则可以安全地假设源中给定名称的所有参数都将在运行时具有这些名称.这对于Kotlin 1.0来说是正确的,并且没有计划改变它.

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

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


Bha*_*rat 7

只是为了完成上面亚历山大的回答,因为它可能不是很明显,要为 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
    }
}
Run Code Online (Sandbox Code Playgroud)

马文

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

    <configuration>
        <args>
            <arg>-java-parameters</arg>
        </args>

    ...
Run Code Online (Sandbox Code Playgroud)

智能

  1. 在Preferences > Kotlin Compiler > Additional command line parameters 中

  2. 附加-java-parameters到列表

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