在 Java 9+ 中,Module(模块)通过 module-info.java 来声明“导出(export)哪些包”。这是 JPMS(Java Platform Module System)的核心。
下面按 原理 → 语法 → 示例 → 常见场景 说明。
exports 的包,才能被其他模块访问module com.example.myapp {
exports com.example.api;
}
表示:
com.example.myappcom.example.apiimport com.example.api.*public / public final 类myapp/
├── src/
│ └── main/
│ └── java/
│ ├── module-info.java
│ └── com/example/api/
│ └── HelloService.java
│ └── com/example/internal/
│ └── InternalUtil.java
module com.example.myapp {
exports com.example.api;
}
package com.example.api;
public class HelloService {
public String sayHello() {
return "Hello";
}
}
✅ 其他模块可以访问
package com.example.internal;
public class InternalUtil {
public static void help() {
System.out.println("inside");
}
}
❌ 其他模块 无法访问
module com.example.client {
requires com.example.myapp;
}
import com.example.api.HelloService;
public class Main {
public static void main(String[] args) {
HelloService service = new HelloService();
System.out.println(service.sayHello());
}
}
exports com.example.api;
exports com.example.spi to com.example.plugin;
⚠️ 即使限定导出:
requires 使用如果你使用:
需要:
opens com.example.api;
或:
opens com.example.api to spring.core, jackson.databind;
| 方式 | 是否可访问 public 类 | 是否允许反射 |
|---|---|---|
exports |
✅ | ❌ |
opens |
✅ | ✅ |
| 未导出 | ❌ | ❌ |
❌ 不能导出整个模块
exports com.example.myapp; // 错误
✅ 只能导出 包
package com.example.internal is not exported
✅ 解决:
InaccessibleObjectException
✅ 解决:
opens com.example.api;
Java Module 通过
module-info.java中的exports控制外部可见性,只有导出的包才能被其他模块访问。
如果你愿意,我可以:
opens免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。