2

私の問題を説明する前に、検索する正しい用語が不足しているのではないかと思うので、ここでのstackoverflorでの検索は実を結びませんでした。したがって、回答へのリンクも非常に高く評価されます。

ファクトリを持つライブラリを作成しようとしています。これを「MyFactory」と呼びましょう。MyFactoryには、抽象クラス「MySuper」のオブジェクトを返すメソッドがありますが、使用可能なサブクラスを「MySuper」に公開するメソッドもあります。ライブラリは多くの拡張を目的としているため、「MySuper」のサブクラスが頻繁に追加され、ライブラリが再コンパイルされ、それを使用するアプリケーションのライブラリフォルダにダンプされます。

私が望んでいるのは、「MySuper」のサブクラスをライブラリに追加し、「MyFactory」にそれを認識させることです。できれば、「MySuper」の新しいサブラスを作成する以外に何もする必要はありません。

これまでのところ、リフレクションを使用して、次のようにメソッドにクラス名を指定することにより、「MyFactory」に「MySuper」タイプの新しいインスタンスを作成させています。

public MySuper getSuperObject(String name) {
    return (MySuper) Class.forName("my.package." + name).newInstance(); }

しかし、ファクトリにすべての「MySuper」クラスをfx a List of Stringとして公開させて、ライブラリを使用するアプリケーションが何を呼び出すことができるかを知るにはどうすればよいでしょうか。パッケージの内容を繰り返すことはできますか?

私は解決策を受け入れています。最も重要な部分は、将来、新しい「MySuper」サブクラスを追加するのは非常に面倒なことではないということです。

ありがとう :-)

アップデート:

リフレクションを簡単に処理し、特定のクラスのサブタイプを検索できる優れたJavaライブラリを見つけたことに注意してください。したがって、私の問題はそのライブラリで解決できます(私はそれをテストしました)。リンクは次のとおりです:http ://code.google.com/p/reflections/

4

3 に答える 3

1

あなたはを探していGeneric Factory Patternます。何かのようなもの..

public static <T extends MySuper> T createDocument(Class<T> subClazz) throws InstantiationException, IllegalAccessException {
        return subClazz.newInstance();
    };

あなたはグーグルするかもしれません、Generic Factory Patternそしてあなたはたくさんの例を見つけるでしょう。

于 2012-11-07T09:36:39.660 に答える
1

デフォルトのクラスローダーは、クラスを検索するまで、クラスについて何も知りません。次に、クラスパスに応じていくつかの場所を調べます。クラスローダーに依存している場合は、名前で要求されるまで、クラスをリストに追加することはできません。

最も自動的な解決策は、MySuperを拡張する新しいクラスの場所(ディレクトリなど)を指定することです。クラスのリストを作成するには、そのディレクトリでクラスファイルを探し、お気に入りのバイトコードライブラリを使用して、MySuperを拡張するクラスがないかどうかを確認します。

もう1つのオプションは、拡張クラス名をリストする構成ファイルを用意することです。

于 2012-11-07T10:14:03.973 に答える
0

MySuperの可能なサブクラスを含む列挙型を作成することをお勧めします。サブクラスを追加するときはいつでも、同じものの列挙型にエントリを追加し、それをgetMySuperObject()メソッドへの入力として指定できます。

私がこのソリューションに何かを残したと思う場合はコメントしてください

于 2012-11-07T09:33:33.553 に答える