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