繁体   English   中英

我的模块化库的用户是否可以通过任何方式访问尚未导出的类?

[英]Is there any way that users of my modular library are able to access classes which have not been exported?

我正在尝试熟悉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放在类路径中的用户将以某种方式找到一种方法来访问假定的受限软件包。

如果您需要其他任何信息,请告诉我。

库的JDK9用户不存在,因为您将使用JDK8Java平台模块系统 ,因此您将编译为大于52的类版本。

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


根据定义

除非是公共类型并且您导出其包,否则其他模块将无法访问模块中的类型。

获得对您的课程的反思访问的唯一方法是,如果您愿意通过以下方式打开它们:

opens your.package

指示。 因此,基本上,您还将了解Reflection方面的内容。
opens指令仅向Reflection公开公共定义。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM