Kotlin 编译器总是保留字节码中的参数名称吗?

问题描述 投票:0回答:2

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

此参数在源代码中声明的名称,或者

null
(如果参数没有名称或其名称在运行时不可用)。无名参数的示例包括成员函数的 this 实例、扩展函数或属性的扩展接收器、不带调试信息编译的Java 方法的参数,以及其他

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

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

reflection parameters kotlin
2个回答
12
投票

要为 Kotlin 类的 Java 反射提供参数名称,即 Java 代码使用反射来查看 Kotlin 代码的参数名称),您必须提供

-java-parameters
参数(自 Kotlin 1.1 起)。

摇篮

在您的

build.gradle
>
compileKotlin
关闭

    compileKotlin {
        kotlinOptions {
            jvmTarget = '1.8'
            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

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

  2. -java-parameters
    添加到列表

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


9
投票

除非以某种方式修改了字节码,否则可以安全地假设源中指定名称的所有参数在运行时都将具有这些名称。 Kotlin 1.0 也是如此,并且没有计划改变这一点。

如果您对 others 包含哪些未命名参数感兴趣,还有默认属性设置器的单个参数和内部类构造函数的外部类参数。这些参数在源代码中和运行时都没有名称。

UPD:因为这可能会让某些人感到困惑,所以这个问题和答案仅与保留参数名称用于 Kotlin 反射有关,特别是这样

KParameter.name
才能工作。这与 Java 反射 在编译的 Kotlin 代码中看到的参数名称无关。要保留 Java 反射的参数名称,请将
-java-parameters
选项传递给 Kotlin 编译器。

© www.soinside.com 2019 - 2024. All rights reserved.