Java 9の最大の機能の1つは、Project Jigsawによって定義されたモジュールシステムになります。 Project Jigsaw:Under the Hood からスライドを読むと、JavaOne 2015で、次のソースコード:
// src/Java.sql/module-info.Java
module Java.sql {
exports Java.sql;
exports javax.sql;
exports javax.transaction.xa;
}
ここで興味深いのは、ファイルが.Java
で終わり、module
とexports
の2つの新しいキーワードを使用しているように見えることです。 Java 9で導入される他のキーワードは何ですか?下位互換性はどのように処理されますか(つまり、module
という名前の関数または変数)?
Java 9のモジュール宣言に追加されたキーワードは、 Java言語仕様、Java SE 9 Edition の3.9に要約されています。==:
さらに10文字のシーケンスは制限付きキーワードです:
open
、module
、requires
、transitive
、exports
、opens
、to
、uses
、provides
、およびwith
。これらの文字シーケンスは、ModuleDeclarationおよびModuleDirectiveプロダクション(§7.7)でターミナルとして表示される場合にのみ、キーワードとしてトークン化されます。 Java SE 9より前に記述されたプログラムとの互換性のために、他のすべての場所で識別子としてトークン化されています。例外が1つあります:ModuleDirectiveプロダクションで必要な文字シーケンスの右側に、文字シーケンス推移的は、区切り文字が後に続く場合を除いて、キーワードとしてトークン化されます。この場合、識別子としてトークン化されます。
現在module
という名前のメソッド、またはここにリストされている他のキーワードを使用している場合、コンパイルは続行されます。
(view
およびpermits
は初期のジグソープロトタイプではキーワードでしたが、それらはずっと前に存在しないために簡略化されました。)
これはおそらく完全なリストではなく、これらのどれも私の知る限りでは確定されていませんが、いくつかは見つかりました。
module
、exports
、provides
、uses
、with
、to
、requires
;説明 ここ :
モジュールシステムは、ServiceLoader :: loadメソッドの呼び出しについてモジュールアーティファクトのクラスファイルをスキャンすることにより、サービスの使用を識別できますが、これは低速で信頼性が低くなります。モジュールが特定のサービスを使用することは、そのモジュールの定義の基本的な側面であるため、効率と明確さの両方のために、uses句を使用したモジュールの宣言でそれを表現します。
module Java.sql { requires public Java.logging; requires public Java.xml; exports Java.sql; exports javax.sql; exports javax.transaction.xa; uses Java.sql.Driver; }
モジュールシステムは、現在のServiceLoaderクラスが行うように、META-INF/servicesリソースエントリのモジュールアーティファクトをスキャンすることで、サービスプロバイダーを識別できます。ただし、モジュールが特定のサービスの実装を提供することも同様に基本的であるため、モジュールの宣言では、provides句を使用して次のように表現しています。
module com.mysql.jdbc { requires Java.sql; requires org.slf4j; exports com.mysql.jdbc; provides Java.sql.Driver with com.mysql.jdbc.Driver; }
...
module Java.base { ... exports Sun.reflect to Java.corba, Java.logging, Java.sql, Java.sql.rowset, jdk.scripting.nashorn; }
また、view
およびpermits
:
大規模なソフトウェアシステムでは、同じモジュールの複数のビューを定義すると便利な場合があります。 1つのビューは他のモジュールによる一般的な使用のために宣言でき、もう1つのビューは、密接に関連するモジュールの選択セットによる使用のみを目的とした内部インターフェイスへのアクセスを提供します。
たとえば、JNDIでは、com.Sun.jndi.toolkit.urlは、モジュール宣言で指定されているように、コスナミングモジュールとkerberosモジュールに対してのみ表示されるようにします。
view jdk.jndi.internal { exports com.Sun.jndi.toolkit.url.*; exports Sun.net.dns.*; permits jdk.cosnaming; permits jdk.kerberos;
}
これにより、モジュールの境界をより柔軟に定義できます。
optional
についての言及も聞きました。
*
module mainModule @ 2.0 {
requires A @ >= 3.0 ; // Use version 3 or above
//scope:compilation,execution,reflection
requires B for compilation optional execution;
requires optional service S1;
requires static E; // need at compile time but optional at runtime
// let mmm requires mainModule then S2 will automatically be there for mmm
requires transitive S2;
provides MI @ 2.0;
provides service MS with C; // provide service with impelemented class C
exports pack;
exports pack.abc to D; //qulified export
permits MF;
class MMain;
/*
syntax for creating view
view ModuleName {
{ProvidesDir|ExportsDir|PermitsDir|EntrypointDir}
}
*/
view N {
provides service NS with AD;
exports MA;
permits MB;
class Main;
}
}
*それがあなたを助けるかもしれないそれをチェックしてください。