jar
プロジェクトでは、特定のディレクトリの下にさまざまなファイルをロードする必要があります。次に.class
、特定の .xml を実装するファイルを検索しますinterface
。検索したものを見つけたら、それをロードする必要がありますClass.forName()
。これをすべて行う簡単な方法はありますか?サンプルコードを提案できますか?
3 に答える
ServiceLoaderを見てください。/META-INF/services/<fqn-of-interface>
これには、これらのクラスの実装者が、そのインターフェースのjarによって提供されるすべての実装クラスをリストするための記述ファイルを提供する必要があります。
クラスが特定のインターフェースを実装しているかどうかは、最初にロードしないと確認できないと確信しています。したがって、すべてのクラスファイルをロードするか、問題を解決するか、別の方法でターゲットを達成する必要があると思います。
.classファイルのバイナリを読み取って、それが実装しているインターフェイスをバイトコードで見つけることができますが、これを行う方法を私に尋ねないでください。:)
また、プレーンJavaアプリケーションを使用していて、インターフェイス<->実装マッピングを事前に定義したい場合は、Markのアプローチも気に入っています。
私が思うことを行う別の方法は、クラスパススキャンをいじくり回すことです。ここでは、現在実行中のクラスパスを検討し、それを使用してアノテーションまたはインターフェイスでコンポーネントを検索します。
この一般的な例は、たとえばSpringです。
Springの外部でこれを使用するには、クラスパス内を検索するためのAPIを提供するReflectionsやClass-Searchなどのライブラリを使用してみてください。
最近、Vaadin / GWTと、現在のクラスパス内で何かを見つけるための彼らのアプローチをいじくり回したので、そのようなものを手動で実装したい場合は、ツールからのこのクラスも興味深いかもしれません。
ただし、Martijnがすでに述べたように、これらのソリューションでは、クラスパスにJARを追加して、クラスが読み込まれ、見つかったコンポーネントを解釈する必要があります。
それが重要で、クラスを事前にロードして後で解釈できない場合は、ASMのようなライブラリの上に何かを構築して、クラスをロードせずにファイルの解釈を提供できるようにすることができ.class
ます。