我的模块化库的用户是否能够访问尚未导出的类?

问题描述 投票:2回答:1

我正在尝试熟悉Java 9中引入的模块系统,我想知道利用它的最佳方法。

对于我正在编写的库,我想执行以下操作(忽略包的命名):

  • 仅通过com.myproject.api公开接口,简单的POJO类和工厂类。用户可以使用此类中的所有内容。
  • 将接口的实现放在com.myproject.core中。用户不应该在这里访问任何内容。

我的理由是用户不需要被实现逻辑混淆或不知所措。相反,他们可以只看(希望)清洁和良好记录的界面。

但是,由于Java包的工作方式,可能很难限制某些类的使用,而不会使它们都是私有的。但我不喜欢将所有类放在一个包中,而是希望将它们组织成各种包。

在阅读了模块系统之后,我相信我可以做到以下几点来实现我想要的。这是module-info.java文件:

module com.myproject {
    exports com.myproject.api;
}  

根据我的理解,我的库的用户将能够使用com.myproject.api包中定义的所有内容(通过在他们自己的module-info文件中使用require com.mypojrect.api)。

但有没有什么方法可以让用户访问com.myproject.core包中的任何内容?我对他们查看代码(通过IDE或源代码本身)没有任何问题,但我只是不想最终支持我不想公开的类/方法/逻辑。

我担心没有模块化应用程序的用户或者将我的库JAR放在类路径上的用户会以某种方式找到一种方法来访问所谓的受限制的包。

如果您需要任何其他信息,请与我们联系。

java java-9 java-module
1个回答
6
投票

您的库的pre-JDK9用户不可能存在,因为您将使用后续JDK8的Java平台模块系统,因此您将编译为大于52的类版本。

说,您的用户将能够查看源代码(如果发货),显然他们将能够提取您的.class文件。


根据定义

其他模块无法访问模块中的类型,除非它是公共类型并导出其包。

获得反射访问你的类的唯一方法是,如果你愿意打开它们,使用

opens your.package

指示。所以基本上,你也被Reflection方面所涵盖。 而opens指令只向公众定义公开了Reflection


如果您想在非模块化/ pre-JDK9环境中控制对类的反射访问,SecurityManager可能就是您所需要的。但是,这需要访问JVM配置。

© www.soinside.com 2019 - 2024. All rights reserved.