猿问

使类公开,但对 JAR 文件保持私有

有没有办法让 Java 类公开,但只能通过 JAR 文件公开?AKA,它不是包私有,而是包公共,但它不是 JAR 公开的?


假设我有这样的结构:


project/

  package1/

    One.java

  package2/

    Two.java

  package3/

    Three.java

由于 3 个 .java 文件位于不同的包中,因此我需要将其公开。但是有没有办法让它们只对包含项目的 JAR 公开?这样如果另一个项目导入 JAR,它就看不到某些公共类/字段?


慕姐8265434
浏览 148回答 3
3回答

慕森王

使用Java 9 中的Jigsaw项目,您可以完全按照您可以决定要导出的包的方式执行此操作。例如:module com.yourproject {  exports com.yourproject.package1;}这将确保仅package1导出。

月关宝盒

现有答案已经指出,适应这种情况的方法是将您的代码模块化(首先添加一个模块声明module-info.java)。只是参考sotms#module-declaration详细说明它们exports可以添加子句来声明该模块使所有且仅public特定包中的类型可供其他模块使用:module com.foo.bar {    requires org.baz.qux;    exports com.foo.bar.alpha;    exports com.foo.bar.beta; } 如果一个模块的声明不包含导出子句,那么它根本不会将任何类型导出到任何其他模块。并从 JLS 部分导出和打开的包该exports指令指定要由当前模块导出的包的名称。对于其他模块中的代码,这将在编译时和运行时授予对包中的publicand类型以及这些类型的and成员的访问权限(第 6.6 节)。它还为其他模块中的代码授予对这些类型和成员的反射访问权限。protectedpublicprotected并进一步涉及合格和不合格的出口......对于限定指令,包中的公共和受保护类型,以及它们的公共和受保护成员,只能由 to 子句中指定的模块中的代码访问。子句中指定的模块to被称为当前模块的朋友。对于非限定指令,任何模块中的代码都可以访问这些类型及其成员。

慕神8447489

是的,Java 9 引入了旨在解决此类问题的模块。
随时随地看视频慕课网APP

相关分类

Java
我要回答