java - 我的模块化库的用户有什么方法可以访问尚未导出的类?
问题描述
我正在尝试熟悉 Java 9 中引入的模块系统,我想知道利用它的最佳方式。
对于我正在编写的库,我想做以下事情(忽略包的命名):
- 仅通过 . 公开接口、简单 POJO 类和工厂类
com.myproject.api
。用户可以使用此类中的所有内容。 - 将接口的实现放在
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 放在类路径上的用户会以某种方式找到访问假定受限包的方法。
如果您需要任何其他信息,请告诉我。
解决方案
您的库的 pre- JDK9
user 不能存在,因为您将使用Java Platform Module System,它是 post- JDK8
,因此您将编译为大于52
.
也就是说,您的用户将能够查看源代码(如果已发布),并且显然他们将能够提取您的.class
文件。
根据定义
模块中的类型不能被其他模块访问,除非它是公共类型并且您导出它的包。
获得反射访问您的课程的唯一方法是,如果您愿意打开它们,使用
opens your.package
指示。所以基本上,你也在这Reflection
方面被覆盖。
并且该opens
指令Reflection
仅公开公共定义。
如果您想在非模块化/预环境中控制对您的类的反射访问, SecurityManager可能是您正在寻找的。但是,这需要访问 JVM 配置。JDK9
推荐阅读
- python - 你知道为什么 Django ls 可能不会出现在项目目录中吗?
- python - 从带有结构的 MATLAB .mat 文件到 numpy 数组的建议?
- multithreading - 多线程如何利用多个内核?
- javascript - 如何在不需要的情况下删除网页上的滚动条?
- python-3.x - 根据行搜索子字符串值创建熊猫数据框
- unit-testing - 使用 Visual Studio 2019 对 BizTalk 架构和地图进行单元测试
- azure-cli - 有没有办法获得 AKS 命名空间?
- sql - 使用别名查询作为表
- python - AttributeError:“WebsocketServerWorker”对象没有属性“add_dataset”
- image - 图像未出现在 Safari 上