【问题标题】:Java package access is strange. Is this intended?Java 包访问很奇怪。这是故意的吗?
【发布时间】:2012-08-14 15:52:33
【问题描述】:

我做了一个实验,我扩展了一个 java.lang 包类,但无法访问包方法或字段(没有公共或受保护的方法或字段)。好的。

然后我将我的扩展放入源根目录的“java.lang”中并再次尝试并编译。所以包访问限制只是装饰性的(你需要把它和其他类放在同一个地方,因此用户可以通过导入 java.lang 找到它),它们实际上也可能是公共的,因为没有实际的较弱这里的访问级别? (protected 至少确保它是一个扩展覆盖)。

【问题讨论】:

  • 你是如何“扩展包”的?
  • 我不太明白。 在你把它放在正确的位置之前,你把它放在哪里?
  • 我没有。我创建了一个 java/util 目录并将我的源文件放在那里。我要纠正那个。 @DaveNewton:我只是在我的项目中拥有它,而不是在任何包中。
  • 我仍然不明白这个问题(并且在正确的包结构之外编译源代码应该不起作用)。感知到的保护问题是什么?应该/不应该做什么可以/不能做什么?
  • 不正确。受保护的也适用于同一包中不相关的类。它严格地弱于默认值。

标签: java compilation package


【解决方案1】:

Java 中存在包的概念,以在类成员的可访问性方面提供额外的粒度级别。由于 Java 中类加载机制的灵活性,当您在与此类 C 相同的包中声明自己的类时,它们不会限制您访问类 C 的包级成员和属性。

一些规范强制执行更严格的访问策略,例如 OSGI。 OSGI 带有 bundle 的附加概念,Java 语言本身没有。 Bundles 是一组打包在单个 jar 中的类。它们在清单文件中声明它们导出哪些类和哪些包,其他包可以访问哪些。那些未导出的包和类严格不能从其他包中访问。

更重要的是,即使导出了 C 类,您也无法从另一个包访问包的 C 类的包级方法和属性。 OSGI 类加载器将不允许您从已经由另一个包“拥有”的包中加载类。

如果您对有关可访问性和打包的这些问题感兴趣,请查看Jigsaw project,它打算重新设计 Java 中的模块化,并且应该在 Java SE 的下一个版本(Java SE 8,虽然我不是确保它没有被推迟)。

【讨论】:

  • 我实际上认为 java 已经有太多的保护类型(应该只是公共和受保护的 - 没有私有或默认)但我喜欢模块,尤其是它们被弃用的部分!
【解决方案2】:

如果你把你的代码放到一个叫java.lang的包里,这意味着你的代码属于那个包,所以你确实可以访问原始java.lang中描述的“包”方法。

想一想:在一个项目中,您有“打包”访问级别的方法,并且您想对它们进行单元测试。您可以在同一个包中的类中执行此操作,这意味着完全相同的目录中,或者您可以有 2 个单独的目录:src 和 test,具有相同的包命名。这样,单元测试可以与代码在同一个包中定义,但它们位于磁盘上的不同位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多