成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java基礎(chǔ)-模塊系統(tǒng)筆記(1)

learning / 3568人閱讀

摘要:模塊系統(tǒng)的前身是項(xiàng)目。最初,該項(xiàng)目僅僅是為設(shè)計(jì)實(shí)現(xiàn)一個(gè)模塊系統(tǒng)。隨著項(xiàng)目的不斷深入,平臺(tái)對標(biāo)準(zhǔn)模塊系統(tǒng)的呼求也日益增長,批準(zhǔn)該項(xiàng)目升級(jí)為平臺(tái)的一部分,也能服務(wù)于和平臺(tái)的需求。自定義的配置,僅包含一組指定的模塊及其所需的模塊。

我的博客 轉(zhuǎn)載請注明原創(chuàng)出處。

Java 9開始,在Java的世界里多了一個(gè)叫模塊(JSR376)的特性。模塊系統(tǒng)的前身是Jigsaw項(xiàng)目。最初,該項(xiàng)目僅僅是為JDK設(shè)計(jì)、實(shí)現(xiàn)一個(gè)模塊系統(tǒng)。后來項(xiàng)目組也希望它能為開發(fā)者所用——雖然,一開始它并不是Java SE平臺(tái)規(guī)范的組成部分。隨著項(xiàng)目的不斷深入,Java平臺(tái)對標(biāo)準(zhǔn)模塊系統(tǒng)的呼求也日益增長,JCP批準(zhǔn)該項(xiàng)目升級(jí)為JavaSE平臺(tái)的一部分,也能服務(wù)于Java MEJava EE平臺(tái)的需求。

官方對Java平臺(tái)模塊系統(tǒng)是這樣描述的: 一種新的Java編程組件,即模塊。它是自描述的代碼與數(shù)據(jù)的集合,有以下特性:

引入了一個(gè)新的可選階段——鏈接時(shí),它介于編譯時(shí)和運(yùn)行時(shí)之間,在此期間可以將一組模塊組裝并優(yōu)化為定制的運(yùn)行時(shí)鏡像。

為工具javac、jlink增加了一些選項(xiàng),以及在Java中,你可以指定模塊路徑,這些路徑定位模塊的定義。

引入模塊化JAR文件,該文件是一個(gè)JAR文件,其根目錄中包含module-info.class文件。

引入JMOD格式,它是一種類似于JAR的打包格式,但它可以包含原生代碼和配置文件。

JDK本身已經(jīng)模塊化。有以下改變:

使你能夠?qū)?b>JDK的模塊組合成各種配置,包括:

JREJDK一樣的配置。

Java SE 8中定義的每個(gè)壓縮配置文件的內(nèi)容大致相同。

自定義的配置,僅包含一組指定的模塊及其所需的模塊。

重構(gòu)JDKJRE運(yùn)行時(shí)鏡像以適應(yīng)模塊并提高性能、安全性和可維護(hù)性。

定義了一個(gè)新的URI方案,用于命名存儲(chǔ)在運(yùn)行時(shí)映像中的模塊,類和資源,而不會(huì)泄露映像的內(nèi)部結(jié)構(gòu)或格式。

刪除認(rèn)可的標(biāo)準(zhǔn)覆蓋機(jī)制和擴(kuò)展機(jī)制。

Java運(yùn)行時(shí)鏡像中刪除rt.jartools.jar。

默認(rèn)情況下,大多數(shù)JDK的內(nèi)部API都不可訪問,但在所有或大部分功能都支持替換之前,可以訪問一些關(guān)鍵的、廣泛使用的內(nèi)部API。

運(yùn)行jdeps -jdkinternals命令以確定你的的代碼是否使用了內(nèi)部JDK API。

兼容性

先來說說模塊系統(tǒng)的兼容性。Java一直是比較保守的,體現(xiàn)在更新上就是良好的兼容性。雖然看了官方對Java平臺(tái)模塊系統(tǒng)的描述好像改動(dòng)非常大,但是你的舊項(xiàng)目即使不模塊化也是能在新JDK上運(yùn)行的。后面會(huì)講到?jīng)]有模塊化的類包是如何與模塊交互的。

為什么要模塊化

既然不模塊化也能好好的運(yùn)行,那么為什么要這么大費(fèi)周章的折騰代碼呢?

第一點(diǎn),Java 9前的Java程序,即使是一個(gè)簡單的輸出Hello World的程序,也必須將整個(gè)JDKJRE運(yùn)行時(shí)鏡像打包進(jìn)去才能運(yùn)行,這時(shí)Java引以為傲的數(shù)量繁多的類庫反而成了累贅。比如開源的優(yōu)秀編程庫——Guava里有很多很實(shí)用的工具類,有時(shí)我們可能只用到了其中一個(gè)類而已,卻不得不將整個(gè)Guava類庫打包進(jìn)我們的項(xiàng)目。

第二點(diǎn),沒法定義類是否能被其他包里的類引用到。比如我們編寫了一個(gè)工具類,如果希望這個(gè)類只能被某些包里的其他類引用到,不暴露給其他包,Java 9前的Java程序是做不到這一點(diǎn)的。

如何模塊化

模塊化一個(gè)項(xiàng)目只要在項(xiàng)目的根目錄創(chuàng)建一個(gè)module-info.class文件就可以了。

如圖所示,我們創(chuàng)建了一個(gè)名為module的模塊并用關(guān)鍵字exports導(dǎo)出了test包。如果有其他模塊導(dǎo)入module模塊就可以引用到Main類了,值得注意的是和test同級(jí)的包和test內(nèi)部的包因?yàn)闆]有被導(dǎo)出,都是不能被引用到的。

而引用一個(gè)模塊則是用關(guān)鍵字requires

然后就可以使用test包內(nèi)的類了:

import test.Main;

/**
 * @author Yuicon
 */
public class Test {

    public static void main(String[] args) {
        Main main = new Main();
        System.out.println(main);
    }

}

不過在導(dǎo)入前還需要在模塊依賴?yán)锾砑右獙?dǎo)入的模塊:

java.base模塊是默認(rèn)導(dǎo)入的,里面有我們常用的類庫:

模塊的強(qiáng)封裝性

我們知道模塊化后就能控制那些包可以被引用到了。不過不止如此,一個(gè)模塊的類是不能訪問到其他模塊里的類的私有屬性的。聽起來好像是理所當(dāng)然的,這是因?yàn)樵任覀兪强梢杂梅瓷鋪碓L問到私有屬性的。模塊化后就算反射也不能訪問到了,算是加強(qiáng)了安全性。

不過這樣的話,那些依賴反射來獲取私有屬性的框架和庫就倒霉了。為了兼容這些框架和庫,我們可以在模塊定義里加一個(gè)關(guān)鍵字open

module-info.class

open module module {
    exports test;
}

這樣我們就聲明了一個(gè)開放的模塊,在模塊的所有軟件包上授予深入的反射訪問權(quán)限(訪問公共和私有API)。

模塊語句

在模塊聲明文件里一共有五種模塊語句,分別是:

導(dǎo)出語句(exports statement)

開放語句(opens statement)

需要語句(requires statement)

使用語句(uses statement)

提供語句(provides statement)

package test.driver;

/**
 * @author Yuicon
 */
public interface Driver {

    int getCode();

}
package test;


import test.driver.Driver;


/**
 * @author Yuicon
 */
public class DriverImpl implements Driver {

    @Override
    public int getCode() {
        return 10086;
    }
}
module module {
    exports test.driver; // 導(dǎo)出包
    provides Driver
            with DriverImpl; // 為接口Driver提供實(shí)現(xiàn)
}

module queue {
    requires module; // 導(dǎo)入包
    opens test; // 開放包的反射權(quán)限
    uses Driver; // 聲明使用接口
}
package main;

import test.driver.Driver;

import java.util.ServiceLoader;


/**
 * @author Yuicon
 */
public class Main {

    public static void main(String[] args) {
        // 獲取實(shí)現(xiàn)
        ServiceLoader serviceLoader = ServiceLoader.load(Driver.class);
        serviceLoader.findFirst().ifPresent(driver -> System.out.println(driver.getCode()));
    }

}

輸出:

10086

Process finished with exit code 0
聚合模塊

你可以創(chuàng)建一個(gè)不包含任何代碼的模塊,它收集并重新導(dǎo)出其他模塊的內(nèi)容,這樣的模塊稱為聚合模塊。假設(shè)有幾個(gè)模塊依賴于五個(gè)模塊,你可以為這五個(gè)模塊創(chuàng)建一個(gè)聚合模塊?,F(xiàn)在,你的模塊只能依賴于一個(gè)模塊——聚合模塊。

為了方便,Java 9包含幾個(gè)聚合模塊,如java.sejava.se.ee。java.se模塊收集Java SE的不與Java EE重疊的部分。java.se.ee模塊收集組成Java SE的所有模塊,包括與Java EE重疊的模塊。

待續(xù)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71719.html

相關(guān)文章

  • Java應(yīng)用架構(gòu)設(shè)計(jì):模塊化模式與OSGi》讀書筆記

    摘要:本書概括以軟件系統(tǒng)為例,重點(diǎn)講解了應(yīng)用架構(gòu)中的物理設(shè)計(jì)問題,即如何將軟件系統(tǒng)拆分為模塊化系統(tǒng)。容器獨(dú)立模塊不依賴于具體容器,采用輕量級(jí)容器,如獨(dú)立部署模塊可獨(dú)立部署可用性模式發(fā)布接口暴露外部配置使用獨(dú)立的配置文件用于不同的上下文。 本文為讀書筆記,對書中內(nèi)容進(jìn)行重點(diǎn)概括,并將書中的模塊化結(jié)合微服務(wù)、Java9 Jigsaw談?wù)劺斫狻?本書概括 以Java軟件系統(tǒng)為例,重點(diǎn)講解了應(yīng)用架構(gòu)...

    seanHai 評(píng)論0 收藏0
  • (CZ深入淺出Java基礎(chǔ))設(shè)計(jì)模式筆記

    摘要:在設(shè)計(jì)模式中,所有的設(shè)計(jì)模式都遵循這一原則。其實(shí)就是說在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設(shè)計(jì)模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風(fēng)清揚(yáng)-超全面的Java基礎(chǔ) 一、面向?qū)ο笏枷朐O(shè)計(jì)原則 1.單一職責(zé)原則 其實(shí)就是開發(fā)人員經(jīng)常說的高...

    李昌杰 評(píng)論0 收藏0
  • 《大型網(wǎng)站系統(tǒng)Java中間件》讀書筆記(上)

    摘要:另一個(gè)用戶請求過來,負(fù)載均衡器指派這個(gè)請求到服務(wù)器。這樣就平攤了請求這種方式就叫做輪詢策略還有很多種,就看你想怎么實(shí)現(xiàn)了,反正這個(gè)邏輯的代碼放在負(fù)載均衡器上。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 這本書買了一段時(shí)間了,之前在杭州沒帶過去,現(xiàn)在讀完第三章,來做做筆記 showI...

    baukh789 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<