我做了一个实验,我扩展了一个 java.lang 包类并且无法访问包方法或字段(没有公共或受保护的方法或字段)。好的。
然后我将我的扩展放入源根目录的“java.lang”中,然后再次尝试并编译。所以包访问限制只是装饰性的(你需要把它和其他类放在同一个地方,因此用户可以通过导入 java.lang 找到它),它们实际上也可能是公共的,因为没有实际的较弱这里的访问级别?(受保护至少确保它是一个扩展覆盖)。
我做了一个实验,我扩展了一个 java.lang 包类并且无法访问包方法或字段(没有公共或受保护的方法或字段)。好的。
然后我将我的扩展放入源根目录的“java.lang”中,然后再次尝试并编译。所以包访问限制只是装饰性的(你需要把它和其他类放在同一个地方,因此用户可以通过导入 java.lang 找到它),它们实际上也可能是公共的,因为没有实际的较弱这里的访问级别?(受保护至少确保它是一个扩展覆盖)。
Java 中存在包的概念,以在类成员的可访问性方面提供额外的粒度级别。由于 Java 中类加载机制的灵活性,当您在与此类 C 相同的包中声明自己的类时,它们不会限制您访问类 C 的包级成员和属性。
一些规范强制执行更严格的访问策略,例如 OSGI。OSGI 带有额外的bundle概念,Java 语言本身没有。Bundles 是一组打包在单个 jar 中的类。它们在清单文件中声明它们导出的类和包,以及其他包可以访问的包。那些未导出的包和类严格不能从其他包中访问。
更重要的是,即使导出了 C 类,您也无法从另一个包访问包的 C 类的包级方法和属性。OSGI 类加载器不允许您从已经由另一个包“拥有”的包中加载类。
如果您对有关可访问性和打包的这些问题感兴趣,请查看Jigsaw 项目,该项目旨在重新设计 Java 中的模块化,并且应该在 Java SE 的下一个版本(Java SE 8,虽然我不确定它没有被推迟)。
如果你把你的代码放到一个名为 java.lang 的包中,这意味着你的代码属于那个包,所以你确实可以访问原始 java.lang 中描述的“包”方法。
想想看:在一个项目中,你有“包”访问级别的方法,你想对它们进行单元测试。您可以在同一个包中的类中执行此操作,这意味着完全相同的目录中,或者您可以有 2 个单独的目录:src 和 test,具有相同的包命名。这样,单元测试可以在与代码相同的包中定义,但它们位于磁盘上的不同位置。