requires声明模块依赖,控制模块级可见性与链接权限,决定本模块能否使用如java.sql等模块导出的公共api,而非管理变量访问。
java 9 起,requires 不是管理“变量访问”的指令,而是声明模块依赖的核心语法。它控制的是**模块级可见性与链接权限**,不作用于字段、方法或局部变量等运行时对象——那些由 private/public 等访问修饰符和封装逻辑决定。真正通过 requires 实战管理的,是你的模块能否使用 java.sql 这类 jdk 内置模块提供的 api(如 connection、preparedstatement)。
明确 requires 的作用对象:模块而非变量
requires java.sql; 的含义是:“本模块在编译和运行时,需要链接并使用 java.sql 模块导出的公共类型”。它不改变你代码里某个 String url 变量的可访问性,但决定了你能否写 new DriverManager().getConnection(url) 这样的调用。
- JDK 模块(如
java.sql、java.logging)默认只导出其公共 API 包(例如java.sql导出java.sql包,但不导出其内部实现包com.mysql.cj.jdbc) - 若未声明
requires java.sql;,编译器直接报错:package java.sql is not visible - 即使写了
requires,你也无法绕过封装去访问java.sql模块内部的非导出类或private成员——这是模块系统强封装性的体现
实战中正确声明 requires 的关键点
在 module-info.java 中声明依赖,不是简单罗列,而需结合用途与安全原则:
-
显式声明必需项:只写你真实用到的模块。比如仅做日志记录,就只需
requires java.logging;,不必引入java.sql或java.desktop -
利用隐式依赖简化配置:
java.base是所有模块的隐式依赖,无需手动写requires java.base;。其他模块(如java.sql)必须显式声明 -
区分传递性依赖:若你的模块 A 导出一个接口,该接口的参数类型来自
java.sql(如void save(Connection conn)),则应写requires transitive java.sql;,这样依赖 A 的模块 B 才能自动获得java.sql的访问权,避免编译失败 -
避免滥用 automatic module:若项目还混用传统 JAR(如 MySQL 驱动
mysql-connector-java.jar),JVM 会将其视为 automatic module,名称由文件名推断(如mysql.connector.java)。此时需写requires mysql.connector.java;,但它自动导出全部包,破坏封装性——应尽快迁移到真正模块化的驱动版本
配合封装机制,守住实际访问边界
requires 解决的是“能不能用”,而变量/字段的安全访问,仍要靠 Java 基础封装手段:
- 数据库连接字符串、密码等敏感值,绝不能声明为
public static final String URL = "...";。应使用private字段 + 带校验的 setter 或构造器注入,并考虑从外部配置加载 - 若提供数据访问服务类,将其放在未导出的包内(如
com.example.dao.internal),仅导出接口包(exports com.example.dao.api;),再通过provides ... with ...注册实现——这样外部模块只能通过接口调用,无法直接访问内部字段 - 返回集合时,避免暴露内部
ArrayList引用:public List<user> getUsers() { return Collections.unmodifiableList(users); }</user>
验证 requires 是否生效的简单方法
写完 module-info.java 后,别只靠 IDE 提示。终端执行以下两步快速验证:
- 编译:运行
javac --module-path mods -d out module-info.java src/com/example/App.java。若缺少requires java.sql;却用了DriverManager,立即报错 - 运行时强制检查:启动时加
--illegal-access=deny参数。若某处试图用反射访问java.sql的非导出类(如com.mysql.cj.jdbc.MysqlConnection),JVM 直接抛IllegalAccessError,说明模块边界生效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











