我正在尝试熟悉Java 9中引入的模块系统,我想知道利用它的最佳方法。
对于我正在编写的库,我想执行以下操作(忽略软件包的命名):
com.myproject.api
公开接口,简单的POJO类和工厂类。用户可以使用此类中的所有内容。com.myproject.core
中。用户应该无法在此处访问任何内容。 我的理由是,用户无需为实现逻辑感到困惑或不知所措。取而代之的是,他们可以仅查看(希望)干净且记录良好的界面。
但是,由于Java包的工作方式,如果不将所有包都私有化,则很难限制某些类的使用。但是我不喜欢将所有类都放在一个包中,而是希望将它们组织成各种包。
在阅读了有关模块系统的知识之后,我相信我可以做以下事情来实现我想要的。这是module-info.java
文件:
module com.myproject {
exports com.myproject.api;
}
据我了解,我的库的用户将能够使用com.myproject.api
包中定义的所有内容(通过在自己的模块信息文件中使用require com.mypojrect.api
)。
但是,用户是否可以通过任何方式访问com.myproject.core
软件包中的任何内容?我对他们(通过IDE或源代码本身)查看代码没有问题,但是我只是不想最终支持我不想公开的类/方法/逻辑。
我担心没有模块化应用程序的用户或将我的库JAR放在类路径上的用户将以某种方式找到访问假定的受限制软件包的方法。
如果您需要其他任何信息,请告诉我。
答案 0 :(得分:6)
库的前JDK9
个用户不存在,因为您将使用后JDK8
后的 Java Platform Module System 。您将编译为大于52
的类版本。
说,您的用户将能够查看源代码(如果已发货),并且显然他们将能够提取您的.class
文件。
按定义
一个模块中的类型不能被其他模块访问,除非它是 公共类型,然后导出其包。
获得反射性对您的类的访问权限的唯一方法是,如果您愿意 打开它们,
opens your.package
指令。因此,基本上,您还将在Reflection
方面受到关注。
并且opens
指令仅向Reflection
公开定义。
如果您想在非模块化/前JDK9
环境中控制对类的 Reflective 访问,则可能需要SecurityManager。 但是,这需要访问JVM配置。