Java9初探(二)

再談Java9模塊化

在之前已經(jīng)提到了作為java9最重要的特性就是模塊化帚戳。有了模塊化java9變得更輕量級。在編譯運行的時候可以更一步的節(jié)省資源全封。上一篇文章中提到了java9模塊化的一些keyword频鉴。介紹的不全面,下面來補充介紹一下模塊化中的keyword

exports

exports PackageName [to ModuleName {, ModuleName}] ;

定義對外暴露的包名(允許外部模塊在運行編譯期間訪問該包下面的所有public永高、protect文件或變量方法隧土,而且允許外部模塊通過反射可以訪問到該包下的public提针、protect文件或者變量方法)。還可以指定具體to哪個模塊曹傀。這樣就可以縮小對外暴露范圍辐脖。只有指定的模塊才可以使用該包下面的文件。否則編譯報錯皆愉。這樣就可以對底層的模塊進行保護嗜价,避免上層調(diào)用。

opens

opens PackageName [to ModuleName {, ModuleName}] ;

定義對外打開的包名(允許外部模塊在運行期間訪問該包下的所有public幕庐、protect文件或變量方法久锥,且允許外部模塊通過反射訪問的該包下的所有類型的資源)。所以opensexports開放的權(quán)限大异剥,但是要通過反射去獲取瑟由。同樣也可以定義具體to哪個模塊,指定授權(quán)該模塊可訪問冤寿。否則運行報錯歹苦。

uses

uses TypeName ;

定義消費的服務(wù)類型《搅可以是一個具體的類暂氯,也可以是一個借口,或者一個注解類(不能是枚舉)亮蛔。然后定義后通過 java.util.ServiceLoader#load(Class)方法可以加載到該服務(wù)的具體實現(xiàn)類痴施。然后循環(huán)迭代調(diào)用。

provides

provides TypeName with TypeName {, TypeName} ;

定義服務(wù)提供者究流。結(jié)合上面的uses使用辣吃。eg:在a模塊中我定義了接口A,且定義了A的實現(xiàn)AImpl芬探,然后我在b模塊中requires a; use A;這樣我在b模塊中使用ServiceLoader加載A.class的時候就可以獲得AImpl實體神得。也可以在b模塊中新增A的實現(xiàn)BImpl,然后在b模塊文件中定義provides A with BImpl偷仿。這樣ServiceLoader就可以獲取到兩個不同的實現(xiàn)(可以根據(jù)實際需要自定義選取哪個實現(xiàn))哩簿。usesprovides是模塊化里面對接口的增強。
eg:

module A

public interface ITest {
    void t();
}

public class ATestImpl implements ITest {
    @Override
    public void t() {
        System.out.println("ATestImpl");
    }
}

module A {
    exports a to B;
    provides a.ITest with a.ATestImpl;
}

module B

public class TestImpl implements ITest {
    @Override
    public void t() {
        System.out.println("TestImpl");
    }
}
public class BTestImpl implements ITest {
    @Override
    public void t() {
        System.out.println("BTestImpl");
    }
}

module B {
    requires A;
    provides a.ITest with b.TestImpl;
    uses a.ITest;
}

public static void main(String[] args) {
        ServiceLoader<ITest> load = ServiceLoader.load(ITest.class);
        load.stream().forEach(t -> t.get().t());
    }

我在兩個模塊中定義了三個實現(xiàn)酝静。但是我只聲明了兩個providesmodule-info中节榜,最終執(zhí)行結(jié)果為

ATestImpl
TestImpl

java9的一些小結(jié)

  • 模塊化。簡化java運行依賴别智,解耦jar包的依賴宗苍,增強封裝特性等。
  • 允許在接口中定義并實現(xiàn)私有方法』淇撸可以提供給接口的默認方法使用(default,static)让歼,這樣多個默認方法且實現(xiàn)代碼有重復(fù)可以通過這種方式重構(gòu),使代碼變得簡潔丽啡。
  • 更方便的集合構(gòu)建方式谋右。可以直接使用List.of(1,2,3,4)這種方式來生成集合补箍。系統(tǒng)會根據(jù)默認值推斷出集合的類型倚评。生成的集合是java.util.ImmutableCollections不可變的。
  • Stream新增takeWhile,dropWhile,ofNullable等方法馏予。使stream操作流更靈活天梧。還支持Optional轉(zhuǎn)Stream
  • java工具大殺器JShell,直接在jdk9的bin目錄下執(zhí)行.jshell就可以進入JShell腳本工具里。直接運行java代碼霞丧∧馗冢可以拋開繁瑣的包名類名main方法等。你甚至只需要執(zhí)行一段可執(zhí)行的代碼即可蛹尝,不需要寫方法后豫。
  • 其它還有很多,比如貨幣的支持突那,新的httpclient挫酿,輕量級json處理,簡化進程API等等愕难。

java9參考文檔

The Java? Language
Specification

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末早龟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猫缭,更是在濱河造成了極大的恐慌葱弟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猜丹,死亡現(xiàn)場離奇詭異芝加,居然都是意外死亡,警方通過查閱死者的電腦和手機射窒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門藏杖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脉顿,你說我怎么就攤上這事蝌麸。” “怎么了弊予?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵祥楣,是天一觀的道長。 經(jīng)常有香客問我汉柒,道長误褪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任碾褂,我火速辦了婚禮兽间,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘正塌。我一直安慰自己嘀略,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布乓诽。 她就那樣靜靜地躺著帜羊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸠天。 梳的紋絲不亂的頭發(fā)上讼育,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音稠集,去河邊找鬼奶段。 笑死,一個胖子當(dāng)著我的面吹牛剥纷,可吹牛的內(nèi)容都是我干的痹籍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晦鞋,長吁一口氣:“原來是場噩夢啊……” “哼蹲缠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悠垛,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吼砂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鼎文,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渔肩,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年拇惋,在試婚紗的時候發(fā)現(xiàn)自己被綠了周偎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撑帖,死狀恐怖蓉坎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胡嘿,我是刑警寧澤蛉艾,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響勿侯,放射性物質(zhì)發(fā)生泄漏拓瞪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一助琐、第九天 我趴在偏房一處隱蔽的房頂上張望祭埂。 院中可真熱鬧,春花似錦兵钮、人聲如沸蛆橡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泰演。三九已至,卻和暖如春葱轩,著一層夾襖步出監(jiān)牢的瞬間睦焕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工酿箭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留复亏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓缭嫡,卻偏偏與公主長得像缔御,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妇蛀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 為什么選擇Java11 容器環(huán)境支持耕突,GC等領(lǐng)域的增強。 進行了瘦身评架,更輕量級眷茁,安裝包體積小。 JDK11 是一個...
    yuhan_sining閱讀 348評論 0 0
  • 一纵诞、Java平臺模塊系統(tǒng) Java平臺模塊系統(tǒng)上祈,也就是 Project Jigsaw,把模塊化開發(fā)實踐引入到了 J...
    這一刻_776b閱讀 152評論 0 0
  • 原文地址:https://www.ibm.com/developerworks/cn/java/the-new-f...
    全能程序猿閱讀 5,604評論 0 2
  • 1. 什么是模塊化 本質(zhì)上浙芙,模塊化就是將系統(tǒng)分解成獨立且相互連接的模塊的行為登刺。java9模塊除了包含代碼外,一個重...
    rubywang08閱讀 1,439評論 0 0
  • 演習(xí)部 授曲第三 人問:既不知音嗡呼,何以制曲纸俭?予曰:釀酒之家,不必盡知酒味南窗,然秫多水少則醇醲揍很,曲好蘗精則香冽郎楼,此理則...
    飛鳥逐溪閱讀 411評論 0 0