私は、Java 9で導入されたモジュールシステムに精通取得しようとしている、と私はそれを活用するための最良の方法を知っていただきたいと思います。
私が書いているライブラリのために、私は(パッケージの命名を無視する)以下を実行したいと思います:
- 唯一のインターフェイス、簡単なPOJOクラス、およびファクトリクラスを経由して公開します
com.myproject.api
。このクラスのすべてがユーザーによって使用することができます。 - のインターフェイスの実装を入れてください
com.myproject.core
。ユーザーは、ここでのアクセスは何のことができるようにはなりません。
私の推論は、ユーザーが混乱したり、実装ロジックに圧倒取得する必要がないということです。代わりに、彼らは(たぶん)きれいな、よくdocumentatedインタフェースで見ることができます。
しかし、Javaパッケージの働き方のために、彼らがすべてのパッケージプライベートにすることなく、特定のクラスの使用を制限することは困難です。しかし、私は1つのパッケージにすべてのクラスを入れて好きではない、むしろ様々なパッケージにそれらを整理します。
モジュールシステムについて読んだ後、私は私が望むものを達成するために、次の操作を行うことができると信じて。これは、module-info.java
ファイル:
module com.myproject {
exports com.myproject.api;
}
私の理解から、私のライブラリのユーザーは、で定義されたすべてのものを使用することができるようになりますcom.myproject.api
(使用してパッケージをrequire com.mypojrect.api
、独自のモジュール-infoファイルに)。
しかし、ユーザーは、アクセス何でもできるようになりますどのような方法があるcom.myproject.core
パッケージには?私は彼らが(IDEまたはソースコード自体を経由して)コードを見ると何の問題もないが、私はちょうど私が公開したくなかったクラス/メソッド/ロジックをサポートするまで終了する必要はありません。
私は、クラスパス上に私のライブラリJARを入れてモジュール化アプリケーションやユーザーを持っていないユーザーは何とかなって制限されたパッケージへのアクセスを取得する方法を見つけるだろうと懸念しています。
あなたが他の情報が必要な場合は私に知らせてください。
前JDK9
あなたが使用するつもりだとして、あなたのライブラリーの利用者は、存在できないJavaプラットフォームモジュールシステム後で、JDK8
ので、あなたはよりクラスのバージョン以上にコンパイルするつもりです52
。
ユーザーが(出荷場合)のソースコードを見ることができるようになります、と明らかに彼らはあなたを抽出することができるようになります、と言った.class
ファイルを。
定義により
それは公共のタイプだとあなたはそのパッケージをエクスポートしない限り、モジュール内のタイプが他のモジュールにアクセスすることはできません。
得るための唯一の方法は反射あなたが喜んでいる場合、あなたのクラスへのアクセスは以下のようになり開くと、それらを
opens your.package
指令。だから、基本的に、あなたは上でもカバーされているReflection
側面。
そして、opens
の指示が公開Reflection
唯一の公共の定義。
あなたがコントロールしたい場合は反射型非モジュラー/前にあなたのクラスへのアクセスをJDK9
、環境、SecurityManagerのは、あなたが探しているものかもしれません。しかし、これはJVMの設定にアクセスする必要があります。