Java9の新機能モジュール モジュラープログラミング方式

王林
リリース: 2023-05-19 13:51:16
転載
895 人が閲覧しました

Java 言語は、バージョン 9 で重要な概念であるモジュールを導入しました。 JavaScript コードのモジュール管理に慣れている場合は、Java 9 のモジュール管理を見ると親しみを感じるはずです。

1. Java モジュールとは何ですか?

モジュールは、Java のパッケージと同様に、より高いレベルの Java コード グループ化を導入します。このような各グループ (モジュール) には、多くのサブパッケージが含まれています。ファイル module-info.java をモジュールのソース コード ファイル パッケージのルートに追加して、フォルダーとそのサブフォルダーをモジュールとして宣言します。ファイルの構文は次のとおりです。

 module xxx.yyy{
  ....
 }
ログイン後にコピー

ここで、xxx.yyy はパッケージ名ではなく、モジュール module によって宣言された名前です。

2. モジュール エクスポート パッケージ

ファイル module-info.java は、モジュール内のどのパッケージが外部から表示され、アクセスできるかを指定できます。この機能は、新しいキーワード exports によって実装されます。

 module xxx.yyy{
  exports com.zimug.java9;
 }
ログイン後にコピー

com.zimug.java9 はパッケージを表します。

指定されたパッケージ内のクラスがパブリックであっても、そのパッケージが「エクスポート」を通じて明示的にエクスポートされない場合、それらはモジュールの外部には表示されないことに注意してください (これは、両方の場合に当てはまります)コンパイル時と実行時)。

3. モジュールのインポート パッケージ

別のモジュールがエクスポートされたパッケージ内のクラスを使用したい場合は、その module -info で requires キーワードを使用できます。 .java ファイルを使用して、対象モジュールのパッケージ package をインポート (読み取り) します。

module def.stu{ requires xxx.yyy;}
ログイン後にコピー

4. Java モジュールの重要性

著者は、Java 9 でのモジュール モジュール管理システムの導入は主にセキュリティ上の考慮事項によるものであると考えています。 Java コードの脆弱性の 90% 以上は、リフレクションと不十分なアクセス制御粒度によって引き起こされますが、Java 9 のモジュラー システムはこの問題を解決します。 Java 9 のモジュール性により、Java コードのより高いレベルの可視性とアクセシビリティ制御が提供されます。

例として、クラスをプライベートとしてマークすると、それは内部クラスであることを意味します。外部クラスの修飾子は public とdefault の 2 つだけです。これには問題もあり、当初は jar パッケージで定義された範囲内でいくつかのパブリック クラスを使用する予定でしたが、その結果、この jar を導入するプロジェクトはすべて、この jar 内のパブリック クラス コードをすべて使用できるようになりました。

つまり、当初の意図は限られた範囲内でパブリックアクセスを提供することでしたが、結果的には無制限のパブリックアクセスになりました。 Java 9 モジュール化の導入後、限定された範囲のコードのパブリック アクセス権が実現され、コードの公開は次の モジュール外の限定された範囲のパブリック アクセスおよび##に分割されます。 #モジュール内パブリックアクセス

5. 例

この例では、2 つのモジュール「common.widget」と「data.widget」を作成し、それらを 1 つのフォルダー「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。ウィジェット/org/jwidgets/SimpleRenderer.java。

このパッケージは、次のテキストではエクスポートされません。

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 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;
}
ログイン後にコピー

です。2 番目のモジュール

module は

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
ログイン後にコピー

エクスポートされていないパッケージ コードを使用しようとしています

パッケージ "org.jwidgets" が "common.widget" モジュールによってエクスポートされていないため、別のモジュール "data.ウィジェット」では、パッケージ クラス

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 として宣言されていても、エクスポートされていないパッケージの下のクラスにはアクセスできません。

以上がJava9の新機能モジュール モジュラープログラミング方式の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート