モジュール・システム
- 最適化されたモジュール構成によってパフォーマンスが向上する。
- モジュール間の依存関係を明確化できる。
- 柔軟な実行環境を実現できる。
- プラットフォーム間の整合性が向上する。
- 公開されたクラスにしかアクセスできないためセキュリティが高まる。
- 名前付きモジュールから自動モジュールにはアクセスできる。
- 無名モジュールから名前付きモジュールにアクセスするには、コンパイルや実行時に--add-modulesオプションを追加する。
- 自動モジュールから無名モジュールにはアクセスできる。
モジュール・ディレティブのうち、リフレクションはopens
ボトムアップ移行
- 最も依存されているモジュールから順番に、名前付きモジュールに変換していく。
トップダウン移行
- 依存しているモジュールから順番に、名前付きモジュールに変換していく。
- 依存されているモジュールは、いったん自動モジュールに変換しておく。
java --module-path modules --module App/Main
java.util.ServiceLoder
java.util.ServiceLoderに関する説明
- SPIを実現するためのクラスである。
- META-INF/services内のファイルを検索する
- loadメソッドにはclassリテラルを渡す。
load()
実装例
public interface Test {
public void execute();
}
ServiceLoder<Test> loader = ServiceLoder.load(Test.class);
for (Test test : loader) {
test.execute();
}
公開するインタフェースをモジュール定義ファイルで宣言するのに使用するディレクティブとしてusesを使用
-jdkinternals
JDKの内部APIでクラスレベルの依存関係を検索するためのもの
実装例
jdeps -jdkinternals C:¥workspace¥jar¥lib.jar
exportsディレクティブ
モジュールでパッケージを利用できるようにするには、exportsを使用する。
SPIで使われる2つのディレクティブ
※ディレクティブ モジュールの定義で使われるもの
①provides(インタフェース)with(実現クラス)
→どのインタフェースをどのクラスで実現するかを定義する
②uses(インタフェース)
→SPIとして利用するインタフェースを定義する
※①②ともに利用する際はインタフェース、実現クラスをexportする必要あり。それかexports定義があるモジュールをrequireする。