有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我的模块库的用户有没有办法访问尚未导出的类?

我试图熟悉Java9中引入的模块系统,我想知道利用它的最佳方法

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

  • 通过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放在类路径上的用户会找到某种方式来访问假定的受限包

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


共 (1) 个答案

  1. # 1 楼答案

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

    也就是说,您的用户将能够查看源代码(如果附带的话),显然,他们将能够提取您的.class文件


    根据定义

    a type in a module is not accessible to other modules unless it’s a public type and you export its package.

    获得反思性课程访问权的唯一方法是,如果您愿意打开课程,并使用

    opens your.package
    

    指令。因此,基本上,我们也将介绍Reflection方面的内容
    并且opens指令只向Reflection公开公共定义


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