如何在Java中的两个包之间共享包私有数据?

fat*_*cat 6 java share encapsulation package package-private

我有2个Java包,A和B.假设包B中的某些类想要使用包A中的一些类,但是,当开发人员出现并开发包C(或者说,应用程序C)时,他/她将使用我的包B,但我希望他/她能够使用B正在使用的A中的类.也就是说,我希望包A中的类是包私有的,以便它们对应用程序开发人员是隐藏的.但是,我确实希望我自己的包B能够访问那些包私有的类.这可以用Java完成吗?我基本上只需要咬紧牙关并公开课程,并希望用户不要尝试使用它们吗?或者,我是否需要复制B中A内的类?

我的偏好不是hack-y(即我不想使用反射).救命?

Edw*_*rzo 6

您可以使用JDK 8及其Project Jigsaw来完成.您可能需要查看Project Jigsaw快速入门指南.

不幸的是,Jigsaw是JDK8的一部分,它还没有完全准备好.预计在2013年1月之前不会完成功能,并且不会在2013年年中之前发布.

但是,您已经可以使用JDK 8预览编译您的类,并使您的想法有效.

在这种情况下,您的问题可以通过将应用程序划分为独立模块来解决.你可以这样做:

module foo {
    exports foo;
    permits bar;
    permits baz;
}
Run Code Online (Sandbox Code Playgroud)

这里只有名为bar或baz的模块才需要模块foo.在foo上对某个其他名称的模块的依赖将无法在编译时,安装时间或运行时解析.如果没有许可条款,那么就没有这样的限制.

不确定像OSGI这样的替代框架,你可以在Apache FelixEclipse Equinox中找到实现提供某种功能来实现这些级别的封装.您可能想要对此进行一些调查.

没有Jigsaw存在的OSGi的问题在于,无论框架强制执行的规则是什么,都可以通过反射来破解,但是一旦Jigsaw准备好供公众使用,这些规则将由Java本身强制执行,如上所述,在编译时,运行时间和安装时间.