首頁  >  文章  >  Java  >  Java9新特性Module模組化程式設計的方法

Java9新特性Module模組化程式設計的方法

王林
王林轉載
2023-05-19 13:51:16875瀏覽

Java語言在其9版中推出了一個重要的概念-模組(module)。如果對javascript程式碼模組化管理比較熟悉的小夥伴,看到Java 9的模組化管理,應該會有似曾相識的感覺。

一、什麼是Java module?

Module引入了Java程式碼分組的更高級別,類似於Java中的package。每個這樣的分組(module)都包含許多子package套件。透過在一個模組的原始碼檔案package的根部,加入檔案module-info.java來聲明該資料夾及其子資料夾為一個模組。該檔案語法如下:

 module xxx.yyy{
  ....
 }

其中xxx.yyy是模組module宣告的名稱,不是package名稱。

二、模組導出package

檔案module-info.java可以指定該模組下面的哪些package對外可見、可存取。透過一個新的關鍵字exports來實現該功能。

 module xxx.yyy{
  exports com.zimug.java9;
 }

com.zimug.java9代表一個package。

要注意的是:即使給定package包中的類別是public的,如果未透過’exports’明確匯出其程式包,則它們在模組外部也是不可見的(在編譯時和執行時都是如此)。

三、模組導入package

如果另一個模組想要使用被導出的package包中的類,可以用requires關鍵字在其module -info.java檔案中來導入(讀取)目標模組的package套件。

module def.stu{ requires xxx.yyy;}

四、Java module的意義

筆者認為,Java 9引入module 模組化管理系統主要是出於對安全性的考量。 Java 程式碼中90%以上的漏洞都是由反射和存取權限控製粒度不足所造成的,Java 9的模組化系統正好能解決這個問題。 Java 9模組化提供了更高層級的Java程式碼可視性和可存取性控制。

作為範例,當我們將一個類別標記為private時,表示它是一個內部類別。外部類別只有兩種修飾符:public和預設(default)。這也意味著一個問題,有些public class我們本來是打算在jar包定義的範圍內使用的,但是結果卻是任何引入了這個jar的項目都可以使用這個jar裡面所有的public class代碼。

也就是我們的原意是在有限範圍內提供公開訪問,結果卻是無限制的對外公開。在引入Java 9模組化之後,可以實作有限範圍內的程式碼public存取權,將程式碼公開區分為:模組外部有限範圍的公開存取模組內部的公開訪問

五、實例

在此範例中,我將建立兩個模組“ common.widget”和“ data.widget”,並將它們放置在單一資料夾“ modules-examples /src」下。檔案“ module-info.java”將放置在每個模組的根資料夾下。
檔案及目錄格式如下:

D:\modules-example>tree /F /A
\---src
    +---common.widget
    |   |   module-info.java
    |   |   
    |   +---com
    |   |   \---zimug
    |   |           RendererSupport.java
    |   |           
    |   \---org
    |       \---jwidgets
    |               SimpleRenderer.java
    |               
    \---data.widget
        |   module-info.java
        |   
        \---com
            \---example
                    Component.java

第一個模組

本程式碼檔案目錄:

modules-example/src/common.widget/ org/jwidgets/SimpleRenderer.java。

這個package在後文中沒有被exports。

package org.jwidgets;
public class SimpleRenderer {
  public void renderAsString(Object object) {
      System.out.println(object);
  }
}

本程式碼檔案目錄:

modules-example/src/common.widget/com/zimug/RendererSupport.java。

這個package在後文中被exports了。

package com.zimug;
import org.jwidgets.SimpleRenderer;
public class RendererSupport {
  public void render(Object object) {
      new SimpleRenderer().renderAsString(object);
  }
}

模組匯出,本程式碼檔案目錄:modules-example/src/common.widget/module-info.java。只導出com.zimug套件,沒有匯出 org.jwidgets套件。匯出的模組名稱為common.widget

module common.widget{
  exports com.zimug;
}

第二個模組

模組匯入common.widget,本程式碼檔案目錄:modules- example/src/data.widget/module-info.java

module data.widget {
  requires common.widget;
}

使用導入模組common.widget中的package:com.zimug。本程式碼檔案路徑:

modules-example/src/data.widget/com/example/Component.java

package com.example;
import com.zimug.RendererSupport;
public class Component {
  public static void main(String[] args) {
      RendererSupport support = new RendererSupport();
      support.render("Test Object");
  }
}

正常編譯執行,結果如下:

Test Object

嘗試使用未被exports的package程式碼

由於套件「 org.jwidgets」尚未透過「 common.widget」模組匯出,因此另一個模組「 data.widget」無法使用該package套件下的類別SimpleRenderer。我們做一個反例,看看會發生什麼:

package com.example;
import org.jwidgets.SimpleRenderer;
public class Component {
  public static void main(String[] args) {
    SimpleRenderer simpleRenderer = new SimpleRenderer(); 
    simpleRenderer.renderAsString("Test Object");
  }
}

編譯報錯資訊如下:

D:\modules-example\src\data.widget\com\example\Component.java:3: error: package org.jwidgets is not visible
import org.jwidgets.SimpleRenderer;         ^
  (package org.jwidgets is declared in module common.widget, which does not export it)
1 error

即使是被宣告為public的,但未被導出的package下的class也不能被訪問。

以上是Java9新特性Module模組化程式設計的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除