gpt4 book ai didi

java - 我的模块化库的用户有什么方法可以访问尚未导出的类?

转载 作者:行者123 更新时间:2023-12-03 23:14:18 24 4
gpt4 key购买 nike

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

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

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

我的理由是用户不需要对实现逻辑感到困惑或不知所措。相反,他们可以(希望)查看干净且文档齐全的界面。

但是,由于 Java 包的工作方式,可能很难限制某些类的使用而不将它们全部包私有(private)。但是我不喜欢把所有的类都放在一个包里,宁愿把它们组织成各种包。

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

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

据我了解,我的库的用户将能够使用 com.myproject.api 包中定义的所有内容(通过使用 require com.mypojrect.api在他们自己的模块信息文件中)。

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

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

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

最佳答案

你的库的 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.

获得Reflective访问你的类的唯一方法是你愿意打开它们,用

opens your.package

指令。所以基本上,您还了解了 Reflection 方面。
opens 指令仅向 Reflection 公开公共(public)定义。


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

关于java - 我的模块化库的用户有什么方法可以访问尚未导出的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55164571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com