【问题标题】:Is there an equivalent of internal protection in java? [duplicate]java中是否有等效的内部保护? [复制]
【发布时间】:2016-02-26 00:02:35
【问题描述】:

在 C# 中,我可以使用关键字 internal 限制对某个类的访问,以及对项目 (dll) 中的其他类的访问。

在 Java 中,最接近 internal 的类是包保护(默认)。但这对我不起作用,因为我在同一个 maven 模块中有其他包需要访问这个类。

如何让我的 maven 模块 (jar) 中的所有类都可以访问我的类,但不能让我的模块外的类访问?

我已经看过this。该帖子没有涉及模块中的其他包。

【问题讨论】:

  • 我想限制 jar 内的访问,就像在 C# 中我可以限制 dll 内的访问。
  • 在 Java 9 之前(和 Project Jigsaw)我认为没有办法(除了将所有东西放在同一个包中)。
  • 你读过this?
  • @MaxG 我认为这确实回答了我的问题。
  • @MaxG:如果您看到重复的问题,请投票结束。更少的重复项使 StackOverflow 成为一个更好的地方:)

标签: java maven maven-3


【解决方案1】:

正如你已经说过的,最接近的匹配当前是 package-private 修饰符。您可以通过不使用任何其他访问修饰符关键字 privateprotectedpublic 来应用它。

Jigsaw 计划集成到 Java 9 中。它为 Java 增加了对模块化的原生支持。这将允许您对其他模块隐藏包:其他模块无法从隐藏的包中看到任何内容,甚至公共类也看不到。因此,类似于 C# 的internal 访问修饰符的机制将通过模块系统引入 Java 9。但是,它不会有新的访问修饰符。

目前,您最好使用OSGi。它使您能够通过应用一些类加载器魔术来模块化您的 Java 代码(魔术是由 OSGi 完成的,您不需要自己做)。它不是标准 JRE 的一部分,但它是一个单独的框架。在 OSGi 中,模块称为捆绑包。一个包有一个外部接口,由一组导出的包定义。其他包只能使用导出包中的类。但是,捆绑包本身可以使用放置在其任何包中的代码。这允许您从其他包中隐藏类,就像 internal 关键字一样。

请记住,使用 OSGi 不是一个容易的决定。使用和设置可能非常复杂。此外,它可能不太适合应用程序服务器,后者也往往会发挥一些类加载器的魔力。

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 2020-01-07
    • 2011-09-28
    • 2012-12-01
    • 2019-06-13
    • 2011-04-07
    • 2012-05-24
    • 2011-07-05
    • 2015-11-23
    相关资源
    最近更新 更多