2012-04-15 7 views
0

プロジェクトでは、特定のディレクトリの下に異なるjarファイルをロードする必要があります。次に、特定のinterfaceを実装するファイル.classを検索します。検索したものが見つかったら、Class.forName()でロードする必要があります。このすべてを行う簡単な方法はありますか?いくつかのサンプルコードを提案できますか?jar内のクラスのリストとロード

答えて

1

また私はあなたがプレーンJavaアプリケーションであればMarkのアプローチが好きで、Interface < - >実装を先にマッピングすることを定義したいと思っています。

あなたが望むことをやり遂げるもう一つの方法は、現在実行中のクラスパスを考慮してクラスパスをスキャンして、それを使ってAnnotationまたはInterfaceでコンポーネントを見つけることです。

この例の一般的な例は、たとえばSpringです。

春以外で使うには、ReflectionsClass-Searchのようなライブラリを使ってクラスパス内を検索することができます。

私は最近、現在のクラスパス内の何かを見つけるためにVaadin/GWTと彼らのアプローチで手を加えているので、手動でそのような何かを実装する場合、そのツールからthis classは同様にあなたのための興味深い可能性があります。

Martijnのように、これらのソリューションはクラスパスにJARを追加する必要があるため、クラスが読み込まれ、見つかったコンポーネントを解釈する必要があります。

クラスが読み込まれずにそれを読み込むことができない場合は、ASMなどのライブラリの上に何かを作成してください。おそらく、クラスをロードせずに.class-ファイルの解釈を提供することができます。

1

クラスが最初に読み込まずに特定のインターフェイスを実装しているかどうかは確認できません。だから、私はあなたがすべてのクラスファイルをロードするか、あなたの問題を解決しようとする/あなたのターゲットを別の方法で達成する必要があると思います。

.classファイルバイナリを読み込み、それが実装するインターフェイスをバイトコードで調べることができますが、これを行う方法を私に尋ねることはできません。 :)

+0

はい、あなたは正しいです。私の実際の問題は、Class.forName()が完全な名前を期待しているので、完全なクラス名(パッケージ付き)を見つけることです。私はあらかじめ瓶のクラス名を知らない。 – cacert

3

ServiceLoaderを見てください。これにより、これらのクラスの実装者は、そのインタフェースのjarによって提供されるすべての実装クラスをリストアップする記述ファイル/META-INF/services/<fqn-of-interface>を提供する必要があります。

+0

それは私の問題に対処しているようです。私はそれのためのいくつかのサンプルコードをGoogleにします。ありがとうございました。 – cacert

関連する問題