Java 模块系统
一、什么是Java module
與Java 中的package有些類似,module引入了Java代碼分組的另一個級別。每個這樣的分組(module)都包含許多子package包。通過在一個模塊的源代碼文件package的根部,添加文件module-info.java來聲明該文件夾及其子文件夾為一個模塊。該文件語法如下:
module xxx.yyy{....}其中xxx.yyy是模塊module聲明的名稱,不是package名稱。
從Java 9開始,原有的Java標準庫已經由一個單一巨大的rt.jar分拆成了幾十個模塊,這些模塊以.jmod擴展名標識,可以在$JAVA_HOME/jmods目錄下找到它們:
二、模塊導出package
文件module-info.java可以指定該模塊下面的哪些package對外可見、可訪問。通過一個新的關鍵字exports來實現該功能。
module xxx.yyy{exports com.zzz;}com.zzz代表一個package。
需要注意的是:即使給定package包中的類是public的,如果未通過'exports'顯式導出其程序包,則它們在模塊外部也是不可見的(在編譯時和運行時都是如此)。
三、模塊導入package
如果另一個模塊想要使用被導出的package包中的類,可以用requires關鍵字在其module-info.java文件中來導入(讀取)目標模塊的package包。
module aaa{requires xxx.yyy; }四、Java module的意義
在筆者看來,Java 9引入module 模塊化管理系統,更多的是從安全性的角度考慮。Java 代碼中90%以上的漏洞都是由反射和訪問權限控制粒度不足引起的,Java 9的模塊化系統正好能解決這個問題。Java 9 module提供另一個級別的Java 代碼可見性、可訪問性的控制。比如說:我們都知道當一個class被修飾為private的時候,意味著這個類是內部類。對于頂級類(外部類)來說,只有兩種修飾符:public和默認(default)。這也就意味著一個問題,有些public class我們本來是打算在jar包定義的范圍內使用的,但是結果卻是任何引入了這個jar的項目都可以使用這個jar里面所有的public class代碼。也就是我們的原意是在有限范圍內提供公開訪問,結果卻是無限制的對外公開。在引入Java 9模塊化之后,可以實現有限范圍內的代碼public訪問權限,將代碼公開區分為:模塊外部有限范圍的公開訪問和模塊內部的公開訪問。
五、例子
- 模塊一
module-info.java
- 模塊二
module-info.java
- 測試
- 如若不requires對應模塊
- 對應的模塊不exports
總結
- 上一篇: Servlet规范
- 下一篇: 以操作系统的角度述说线程与进程