是否可以在 Kotlin 中为内部委托属性提供自定义名称?



我有以下代码片段,我想从Java内部从同一代码库访问scriptDsl属性。我不想公开揭露scriptDsl

class ScriptDsl {
internal val scriptDsl: JScriptDsl by lazy { //... }
}

编译后,scriptDsl变得public final JScriptDsl getScriptDsl$esw_ocs_dsl_kt()但我想在这里提供自定义名称,这对于使用JvmName("scriptDsl")的非委托属性是可能的。 如何为internal delegated properties做到这一点?

如果有其他更好的解决方案,我很好,我的要求是">

  • 我想在同一模块中从 java 调用scriptDsl
  • 我使用反射来称呼它,所以需要事先知道这个名字
  • ScriptDsl是公共的,我不希望在模块外部访问属性scriptDsl
  • scriptDsl必须懒惰,因为它依赖于其他属性,这些属性在声明时可能不可用

注意:我知道 kotlin 中的internal在 java 中是public的。

来自 kotlin 文档:

内部声明在 Java 中是公开的。内部类的成员会经历名称重整,以使其更难从 Java 意外使用它们,并允许重载具有相同签名的成员,这些成员根据 Kotlin 规则看不到彼此;

您可以像这样指定 getter 的注释目标:

class ScriptDsl {
@get:JvmName("scriptDsl")
internal val scriptDsl: JScriptDsl by lazy { //... }
}

然后只需用scriptDsl调用它:

ScriptDsl scriptDsl = new ScriptDsl();
scriptDsl.scriptDsl();

最新更新