體驗JDK9新特性:模塊

概述

體驗JDK9新特性:模塊

JDK9發佈以來,JAVA添加了一個重要的新功能,稱為“模塊”。模塊提供了一種描述組成應用程序的代碼的關係和以來層次的方式。模塊還允許控制其中的哪些部分可以訪問其他模塊,哪些不能訪問其它模塊。使用模塊可以創建更可靠、更具伸縮性的應用。

一般而言,模塊對大型應用程序有很大的好處,因為模塊可以降低與大型系統相關的管理複雜性。但是小規模的程序也能得益於模塊,因為JDK的API現在組織到模塊中。因此,如今的JAVA程序可以指定需要那部分的API,不需要哪部分的API。這項改變有助於計算機以更短的運行時間部署程序。

體驗JDK9新特性:模塊

對模塊的支持通過語言元素來提供,包括新關鍵字,以及對javac、java和其他JDK工具的改進,而且引入了新工具和文件格式。簡單地說,模塊是JAVA9的一個新特性。

模塊基礎

在最基本的意義上,模塊可以通過模塊名統一指代的包和資源的一種組合。模塊聲明指定了模塊的名稱,定義了模塊及其包與其他模塊的關係。模塊聲明是JAVA源文件中的語句。通過與之相關的幾個關鍵字來支持:

exports、module、open、opens、provides、requires、to、transitive、uses、with

注意,這些關鍵字盡在模塊聲明的時候才會被看成關鍵字,在其他情況下,都會被解釋為標識符。這樣的設計,可以防止已有的舊代碼把這些用於標識符時出現的兼容性問題。例如,假如在JDK9之前的某個程序中使用requires作為變量名。將改程序移植到JDK9之後,如果requires在模塊外被識別為關鍵字,這段代碼就會出現編譯錯誤。盡在模塊中將requires看做關鍵字可以有效的防止這一點,因此關鍵字requires也可以用作變量名,只是這種用法不推薦而已。

模塊聲明包含在module-info.java文件中。因此,模塊在JAVA源文件中定義。這個文件由javac編譯到一個類文件中,稱為模塊描述符。module-info.java文件只能包含一個模塊定義,不是通用文件。模塊聲明以關鍵字module開頭,一般形式如下:

module myModule {}

其中,myModule是模塊名,必須是java有效的標識符。

牛刀小試

1)創建目錄moduleapp,這是應用的頂級目錄。

2)在moduleapp下創建目錄appsrc,這是存放源代碼的。

3)在appsrc下創建目錄appstart。在這個子目錄下在創建子目錄appstart,在這個子目錄下在創建appdemo,因此,從appsrc開始創建瞭如下結構:

appsrc\appstart\appstart\appdemo

4)在appsrc下創建appfuncs。在這個子目錄下在創建appfuncs,在這個子目錄下創建simplefuncs,因此,從appsrc開始創建瞭如下結構:

appsrc\appfuncs\appfuncs\simplefuncs

5)整個建好的目錄結構如圖:

體驗JDK9新特性:模塊

6)在appfuncs\simplefuncs目錄下,寫一個SimpleMathFuncs.java:

體驗JDK9新特性:模塊

package appfuncs.simplefuncs; 
/**
* @author 擺技
*/
public class SimpleMathFuncs {

//b能否被a整除
public static boolean isFactor(int a, int b) {
if((b%a) == 0) return true;
return false;
}

//返回a和b的最小公因數
public static int lcf(int a, int b) {
a = Math.abs(a);
b = Math.abs(b);
int min = a < b ? a : b;

for(int i = 2; i <= min/2; i++) {
if(isFactor(i, a) && isFactor(i, b)){
return i;
}
}
return 1;
}

//返回a和b的最大公因數
public static int gcf(int a, int b) {
a = Math.abs(a);
b = Math.abs(b);
int min = a < b ? a : b;

for(int i = min/2; i >= 2; i--) {
if(isFactor(i, a) && isFactor(i, b))
return i;
}

return 1;
}
}

7)在appstart\appdemo下寫一個ModuleAppDemo.java,導入了SimpleMathFuncs類,使用了SimpleMathFuncs中的方法。

體驗JDK9新特性:模塊

package appstart.appdemo; 

import appfuncs.simplefuncs.SimpleMathFuncs;
/**
* @author 擺技
*/
public class ModuleAppDemo {
public static void main(String[] args) {

if(SimpleMathFuncs.isFactor(2, 10)){
System.out.println("2是10的因數");
}

System.out.println("35和105的最小公因數是:" + SimpleMathFuncs.lcf(35, 105));
System.out.println("35和105的最大公因數是:" + SimpleMathFuncs.gcf(35, 105));
}
}

8)在appsrc\appfuncs下添加aapfuncs模塊文件module-info.java:

體驗JDK9新特性:模塊

module appfuncs { 
exports appfuncs.simplefuncs;
}

9)在appsrc\appstart下添加模塊文件module-info.java:

體驗JDK9新特性:模塊

module appstart { 
requires appfuncs;
}

編譯程序

JDK9開始支持模塊,因此與其他JAVA程序一樣,基於模塊的程序也可以使用javac編譯。不過我們需要給編譯器指定模塊路徑,而且確保在moduleapp目錄下執行javac命令。

1)使用如下命令編譯SimpleMathFuncs.java文件:

javac -d appmodules/appfuncs appsrc/appfuncs/appfuncs/simplefuncs/SimpleMathFuncs.java

2)使用如下命令編譯appfuncs模塊:

javac -d appmodules/appfuncs appsrc/appfuncs/module-info.java

3)以上兩步可以併為一步:

javac -d appmodules/appfuncs appsrc/appfuncs/module-info.java 
appsrc/appfuncs/appfuncs/simplefuncs/SimpleMathFuncs.java

4)現在使用一個命令編譯appstart模塊和ModuleAppDemo.java文件

javac --module-path appmodules -d appmodules/appfuncs 
appsrc/appstart/module-info.java
appsrc/appstart/appstart/appdemo/ModuleAppDemo.java

運行程序

使用如下命令運行改程序:

javac --module-path appmodules -m appsrc/appstart.appdemo.ModuleAppDemo

得到如下結果:

2是10的因數
35和105的最小公因數是:5
35和105的最大公因數是:7

如果大家有興趣,我會繼續更新模塊的相關內容!

體驗JDK9新特性:模塊


分享到:


相關文章: