java - 是否可以为 kotlin 中的内部委托(delegate)属性提供自定义名称?

标签 java kotlin

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

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

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

如果有其他更好的方案我也可以,我的要求是"

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

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

来自 Kotlin 文档:

internal 声明在 Java 中公开。内部类的成员经过名称重整,以防止从 Java 中意外使用它们,并允许根据 Kotlin 规则重载具有相同签名但彼此看不到的成员;

最佳答案

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

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

然后用scriptDsl调用它:

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

关于java - 是否可以为 kotlin 中的内部委托(delegate)属性提供自定义名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58497383/

相关文章:

android-studio - Kotlin 文件的 IntelliJ 和 Android Studio 图标

kotlin - 在从暂停的存储库中获取的 ViewModel 中传递 LiveData 的正确方法

java - 创建多个对象以实现 Spring Boot 最佳实践

java - 检查网站每个链接的最佳方法是什么?

java - LibGDX 项目可以在 Sublime Text 3 中运行吗?

kotlin - JOOQ:如何向记录类添加接口(interface)以允许通用插入数据

android - 如何检查Content Provider中是否有数据

java - 我收到 exception-org.apache.catalina.core.ApplicationDispatcher.invoke 抛出异常 java.lang.IllegalStateException

java - 管理来自同一个 servlet 的两个 JSP 输出

Android 应用清理架构 : Should data layer have its own model classes?