我的模块化库的用户是否可以通过任何方式访问尚未导出的 类?
Is there any way that users of my modular library are able to access classes which have not been exported?
我正在尝试熟悉 Java 9 中引入的模块系统,我想知道利用它的最佳方式。
对于我正在编写的库,我想执行以下操作(忽略包的命名):
- 仅公开接口、简单的 POJO classes 和工厂 classes 通过
com.myproject.api
。 class 中的所有内容都可供用户使用。
- 将接口的实现放在
com.myproject.core
中。用户应该无法访问此处的任何内容。
我的理由是用户不需要对实现逻辑感到困惑或不知所措。相反,他们可以(希望)查看干净且文档齐全的界面。
但是,由于 Java 包的工作方式,可能很难限制某些 class 的使用而不将它们全部包私有。但是我不喜欢把所有的class都放在一个包里,宁愿把它们组织成各种包。
在阅读了模块系统之后,我相信我可以通过以下方式来实现我想要的。这是 module-info.java
文件:
module com.myproject {
exports com.myproject.api;
}
据我了解,我的库的用户将能够使用 com.myproject.api
包中定义的所有内容(通过在他们自己的模块信息文件中使用 require com.mypojrect.api
)。
但是有没有什么方法可以让用户访问 com.myproject.core
包中的任何内容?我不介意他们查看代码(通过 IDE 或源代码本身),但我只是不想最终支持我不想公开的 classes/methods/logic。
我担心没有模块化应用程序的用户或将我的库 JAR 放在 class 路径上的用户会以某种方式找到一种方法来访问假定的受限包。
如果您需要任何其他信息,请告诉我。
你的图书馆的前JDK9
用户不能存在,因为你将要使用Java平台模块系统,它是post-JDK8
,因此您将编译为大于 52
.
的 class 版本
也就是说,您的用户将能够查看源代码(如果已发布),显然他们将能够提取您的 .class
文件。
根据定义
a type in a module is not accessible to other modules unless it’s a
public type and you export its package.
获得 Reflective 访问您的 class 的唯一方法是,如果您愿意 打开 它们,并且
opens your.package
指令。所以基本上,您也涵盖了 Reflection
方面。
opens
指令仅向 Reflection
公开 public 定义。
如果您想在 non-modular/pre-JDK9
环境中控制 Reflective 对您的 class 的访问,SecurityManager可能是你要找的。 但是这需要访问 JVM 配置。
我正在尝试熟悉 Java 9 中引入的模块系统,我想知道利用它的最佳方式。
对于我正在编写的库,我想执行以下操作(忽略包的命名):
- 仅公开接口、简单的 POJO classes 和工厂 classes 通过
com.myproject.api
。 class 中的所有内容都可供用户使用。 - 将接口的实现放在
com.myproject.core
中。用户应该无法访问此处的任何内容。
我的理由是用户不需要对实现逻辑感到困惑或不知所措。相反,他们可以(希望)查看干净且文档齐全的界面。
但是,由于 Java 包的工作方式,可能很难限制某些 class 的使用而不将它们全部包私有。但是我不喜欢把所有的class都放在一个包里,宁愿把它们组织成各种包。
在阅读了模块系统之后,我相信我可以通过以下方式来实现我想要的。这是 module-info.java
文件:
module com.myproject {
exports com.myproject.api;
}
据我了解,我的库的用户将能够使用 com.myproject.api
包中定义的所有内容(通过在他们自己的模块信息文件中使用 require com.mypojrect.api
)。
但是有没有什么方法可以让用户访问 com.myproject.core
包中的任何内容?我不介意他们查看代码(通过 IDE 或源代码本身),但我只是不想最终支持我不想公开的 classes/methods/logic。
我担心没有模块化应用程序的用户或将我的库 JAR 放在 class 路径上的用户会以某种方式找到一种方法来访问假定的受限包。
如果您需要任何其他信息,请告诉我。
你的图书馆的前JDK9
用户不能存在,因为你将要使用Java平台模块系统,它是post-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.
获得 Reflective 访问您的 class 的唯一方法是,如果您愿意 打开 它们,并且
opens your.package
指令。所以基本上,您也涵盖了 Reflection
方面。
opens
指令仅向 Reflection
公开 public 定义。
如果您想在 non-modular/pre-JDK9
环境中控制 Reflective 对您的 class 的访问,SecurityManager可能是你要找的。 但是这需要访问 JVM 配置。