ホームページ >Java >&#&チュートリアル >Java9の新機能モジュール モジュラープログラミング方式
Java 言語は、バージョン 9 で重要な概念であるモジュールを導入しました。 JavaScript コードのモジュール管理に慣れている場合は、Java 9 のモジュール管理を見ると親しみを感じるはずです。
モジュールは、Java のパッケージと同様に、より高いレベルの Java コード グループ化を導入します。このような各グループ (モジュール) には、多くのサブパッケージが含まれています。ファイル module-info.java をモジュールのソース コード ファイル パッケージのルートに追加して、フォルダーとそのサブフォルダーをモジュールとして宣言します。ファイルの構文は次のとおりです。
module xxx.yyy{ .... }
ここで、xxx.yyy はパッケージ名ではなく、モジュール module によって宣言された名前です。
ファイル module-info.java は、モジュール内のどのパッケージが外部から表示され、アクセスできるかを指定できます。この機能は、新しいキーワード exports
によって実装されます。
module xxx.yyy{ exports com.zimug.java9; }
com.zimug.java9
はパッケージを表します。
指定されたパッケージ内のクラスがパブリックであっても、そのパッケージが「エクスポート」を通じて明示的にエクスポートされない場合、それらはモジュールの外部には表示されないことに注意してください (これは、両方の場合に当てはまります)コンパイル時と実行時)。
別のモジュールがエクスポートされたパッケージ内のクラスを使用したい場合は、その module -info で requires
キーワードを使用できます。 .java ファイルを使用して、対象モジュールのパッケージ package をインポート (読み取り) します。
module def.stu{ requires xxx.yyy;}
著者は、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 errorpublic として宣言されていても、エクスポートされていないパッケージの下のクラスにはアクセスできません。
以上がJava9の新機能モジュール モジュラープログラミング方式の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。