我有2个Java包,A&B.让我们说,在程序包B部分班级要然而使用级封装了一些类,当开发人员走来,开发包C(或者说,应用程序C),他/她将用我的程序包B,但我不想让他/她能够使用类放入B是使用。 这就是说,我想在包我的班被包专用,使他们从应用程序开发人员隐藏。 不过, 我想我自己的包B到能够访问那些包私有类。 可以这样用Java来完成? 我基本上只需要硬着头皮并使类公共和只是希望用户不尝试使用它们? 或者,我需要复制是在B的内部类?
我更倾向于将东西是没本事-Y(即我不想使用反射)。 救命?
我有2个Java包,A&B.让我们说,在程序包B部分班级要然而使用级封装了一些类,当开发人员走来,开发包C(或者说,应用程序C),他/她将用我的程序包B,但我不想让他/她能够使用类放入B是使用。 这就是说,我想在包我的班被包专用,使他们从应用程序开发人员隐藏。 不过, 我想我自己的包B到能够访问那些包私有类。 可以这样用Java来完成? 我基本上只需要硬着头皮并使类公共和只是希望用户不尝试使用它们? 或者,我需要复制是在B的内部类?
我更倾向于将东西是没本事-Y(即我不想使用反射)。 救命?
你可以用它做JDK 8和Jigsaw项目 。 你可能想给看看Jigsaw项目快速启动指南 。
不幸的是,拼图是JDK8的一部分,它不是完全准备好。 据预计不会有完整的,直到2013年1月和2013年年中之前不会被释放。
但是,你已经可以使用JDK 8预览编译你的类,让你的思想工作。
在这种情况下,你的问题可以通过将您的应用程序在独立的模块来解决。 你可以这样做:
module foo {
exports foo;
permits bar;
permits baz;
}
这里只能通过模块命名的酒吧或巴兹需要的模块foo中。 从富时一个其他名称的模块A的依赖不会在编译时解析,安装时间或运行时间。 如果没有许可证条款存在则没有这样的约束。
不知道如果替代框架,如OSGI ,其中你可以找到在实现Apache的菲利克斯和Eclipse之后提供某种功能来实现封装的这些水平。 这是可能的,你可能想要去查了一下这个问题。
这个问题的OSGi没有拼图的存在是由框架强制任何规则可以通过反射被打破,一旦拼图已经准备好供市民使用,不过,这些规则将通过Java本身执行,因为你在上面阅读,在编译时,运行时间和安装时间。
您可以使用OSGi做到这一点。 Android和JDK 6的目标不是在这种情况下的一个问题,也有运行在Android上的OSGi框架- >如看到的Android mBedded服务器 。 您可以从链接下载一个免费的非商业版本。
您有几种选择如何做,在OSGi的,这取决于你想要达到的目标。
选项1(推荐):你可以把包A和B在同一个包AB和出口仅货物B在该软件包出口-包的清单。 封装/应用程序C或任何其他“用户”应用程序可以导入包B和使用它。 而且它不能使用,甚至没有看到包A,因为它是内部的管束AB。 你不需要在Java级别的任何特殊声明或依赖; 这将与任何JVA版本的工作,因为模块化和独立的bundle空间是OSGi的基础知识的一部分,不依赖于最新的Java版本或不便。
选项2:如果你想要某种原因套餐A和B在不同的包分开,你可以让他们的话,你会导出并在清单中导入数据包,然后控制其束具有使用权限要导入的包权(见OSGi的权限和有条件允许的服务)。 然而,这是更复杂的实现。
方案3:你也可以把一个包在一个片段捆绑并允许它附加到包含B.这样B就可以访问套餐A捆绑,但在同一时间,你就可以单独更新程序包在运行时,如果你想要的。 由于片段包作为私人主机束处理(在这种情况下的主机是一个包含程序包B的束),捆绑Ç不会看到A.它将只看到什么是由束B.出口
既然您不熟悉OSGi的,我会建议,如果需要,你可以你的方法升级到选项3,如果你想以后开始witl选项1,然后。
@Edwin Dalorzo:这肯定是不正确的,在OSGi的规则可以通过反射被打破。 捆绑在OSGi的独立的类加载器。 您可以从捆绑C作为多反映,你不会为这些类,你会得到的仅仅是一个ClassNotFound的异常 - 相信我,我已经看到了足够的时间;)