首页 文章

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

提问于
浏览
4

kotlin-reflect 中,类 KParameter 具有可空 name ,其KDoc说:

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

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

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

2 回答

  • 6

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

    如果您对其他包含的未命名参数感兴趣,那么's also the single parameter of a default property setter and the outer class parameter for an inner class constructor. Such parameters don'在源代码和运行时都没有名称 .

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

  • 3

    只是为了完成亚历山大的答案,因为它可能不是很明显, to provide parameter names for Java reflection of Kotlin classes (即使用反射来查看Kotlin代码的参数名称的Java代码),你必须提供 -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
        }
    }
    

    Maven

    <plugin>
        <artifactId>kotlin-maven-plugin</artifactId>
        <groupId>org.jetbrains.kotlin</groupId>
        <version>${kotlin.version}</version>
    
        <configuration>
            <args>
                <arg>-java-parameters</arg>
            </args>
    
        ...
    

    IntelliJ

    • 在首选项> Kotlin编译器>其他命令行参数中

    • -java-parameters 追加到列表中

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

相关问题