我有 2 个 Java 包,A 和 B。假设包 B 中的某些类想要使用包 A 中的某些类,但是,当开发人员出现并开发包 C(或者说应用程序 C)时,他/她将使用我的包 B 但我do not希望他/她能够使用 B 正在使用的 A 中的类。也就是说,我希望包 A 中的类是包私有的,以便应用程序开发人员看不到它们。但是,我do希望我自己的包 B 能够访问那些包私有的类。这可以在 Java 中完成吗?我是否基本上只需要硬着头皮将类公开,并希望用户不要尝试使用它们?或者,我是否需要将 A 中的类复制到 B 中?
我的偏好是非 hack-y 的东西(即我不想使用反射)。帮助?
你可以这样做JDK 8 http://jdk8.java.net/jigsaw/和它的拼图项目 http://cr.openjdk.java.net/~mr/jigsaw/notes/jigsaw-big-picture-01。您可能想看看拼图项目快速入门指南 http://openjdk.java.net/projects/jigsaw/doc/quickstart.html.
不幸的是,Jigsaw 是 JDK8 的一部分,而且还没有完全准备好。预计功能不会完整直到 2013 年 1 月 http://mail.openjdk.java.net/pipermail/jdk8-dev/2012-April/000942.html并且不会在 2013 年年中之前发布。
但是,您已经可以使用 JDK 8 预览版编译您的类并让您的想法发挥作用。
在这种情况下,可以通过将应用程序划分为独立的模块来解决您的问题。你可以这样做:
module foo {
exports foo;
permits bar;
permits baz;
}
这里,只有名为 bar 或 baz 的模块才需要模块 foo。某些其他名称的模块对 foo 的依赖在编译时、安装时或运行时将无法解析。如果不存在许可条款,则不存在此类限制。
不确定是否有替代框架OSGI http://en.wikipedia.org/wiki/OSGi,您可以在其中找到实现阿帕奇菲利克斯 http://felix.apache.org/site/index.html and 日食春分 http://www.eclipse.org/equinox/提供某种功能来实现这些级别的封装。您可能想对此进行一些调查。
问题在于OSGi http://en.wikipedia.org/wiki/OSGi如果没有 Jigsaw 的存在,框架强制执行的任何规则都可以通过反射来打破,但是,一旦 Jigsaw 准备好供公众使用,这些规则将由 Java 本身强制执行,正如您在上面所读到的,在编译时、运行时和安装时时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)