【问题标题】:What is the internal kotlin modifier in byte code?字节码中的内部 kotlin 修饰符是什么?
【发布时间】:2019-07-03 10:42:46
【问题描述】:
  1. 如果我用 kotlin 创建库并用 internal 标记某个类,它在 maven 和 IDE 中没有 Kotlin 插件的 java 看起来如何,它将只是 public 或 package 或 JVM 具有 java 没有的其他修饰符?
  2. 如果我在一个模块中使用一个带有@service 注释的类并将其标记为内部,并在其他模块中使用此模块,它是否有效?
  3. 它在字节码中看起来如何?

【问题讨论】:

  • 这些声明在获取字节码时是公开的,但它们的名称被弄乱了,这样 Java 客户端就不会意外调用它们。所以......这不是完全安全的,但它表明它们不应该被调用。 kotlinlang.org/docs/reference/…
  • @zsmb13 为什么这不是一个答案?
  • @zsmb13 你是什么意思弄错了,例如我有一个带有“计算”功能的“CalculateRepository”类,这些名字将如何被弄乱?

标签: java kotlin


【解决方案1】:

这些声明在获取字节码时是公开的,但是它们的名称被打乱了,因此 Java 客户端不会意外调用它们。所以......这不是完全安全,但它表明它们不应该被调用。 (这在文档here 中)。

例如,如果您将一个名为 calculate 的函数标记为内部函数,则它可能以字节码中的名称 calculate$modulename 结尾。 (至少根据我对此的测试,似乎确实有一些名称没有被破坏的情况。)

此外,IntelliJ 还将检测是否使用 internal 可见性编译了声明(因为有元数据表明这一点),并在您尝试使用它时向您显示错误。

【讨论】:

  • 是不是说如果我在ide中不使用Kotlin插件,使用库中的此类,就编译不了?
  • 我相信它会编译,而且它可能会在没有警告的情况下编译。确实,您应该创建一个包含两个模块的项目并尝试这些极端情况。一般的结论是,如果有人愿意,内部的东西总是可以从 Java 代码中调用的。
  • 我指的是库,而不是模块。
  • internal修饰符而言,访问库的工作方式与另一个模块相同。
  • 对不起,我的意思是访问库的这样的类(内部类CalculateRepository”),当我不使用任何kotlin插件时。我没有得到任何亮点,好吧,很好。但是编译呢,如果不是我会得到什么错误,它会编译吗?
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 2014-05-09
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
相关资源
最近更新 更多