2011-10-01 27 views
5

私はちょうどJavaを学んでいます。私はいくつかの問題を抱えています。 ここでは、単純なファクトリパターンを持っている:自動工場登録

public class SomeFactory { 
    ... 
    public static void registerProduct(String name, Class<? extends IProduct > f) 
} 

public SomeProduct implements IProduct { 
    static { 
     SomeFactory.register("some product", SomeProduct.class); 
    } 
    ... 
} 

すべての製品は、工場出荷時に自分自身を登録する必要があります。

ただし、このコードを使用する前に、すべての商品クラスを読み込む必要があります。 例えば、main関数にClass.forName()をどこかに置くことができます。 しかし、私はそのような種類の手動クラスの読み込みを避けたいと思います。新しいIProduct 実装を追加するだけで、他の部分(例えばSomeFactoryまたはMainメソッドなど)を更新する必要はありません。 しかし、私はいくつかのクラス(例えば注釈でマークされている)を自動的に読み込むことは可能でしょうか?

P.S実行時に他のクラスは追加されません。コンパイルする前にすべてIProductの実装がわかっています。

UPD#1 お返事ありがとうございます! しかし、IProductインスタンスで自動生成されたプロパティファイルを作成することはできますか? 私は、プロパティファイルやローダーコードを生成するいくつかのビルドタイムスクリプト(例えば、maven用)を作成することは可能ですか?そのようなソリューションやフレームワークはありますか?

UPD#2 私は、起動時にクラスパスをスキャンすることによって、実行時の情報を提供しReflections libraryを使用して仕上げました。

答えて

5

これは可能ですが、容易ではありません。クラスパス内のすべてのクラスをスキャンして、アノテーションがあるかどうかを確認したり、IProductインターフェイスを実装したりする必要があります。このような問題の解決方法については、How do you find all subclasses of a given class in Java?を参照してください。

私は単純なままで、ロードするクラスのリストを、ファクトリー自体または外部ファイル(プロパティーファイルなど)に持っています。外部プロパティファイルは、すべての製品を追跡することができます

class MyProduct1{ 

    static{ 
     SomeFactory.register(this.getClass()); 
    } 
    .. 
    .. 
} 
  • 3
    1. は、このような静的なブロックを使用して、各製品が自身を登録持っています。

    2. メインメソッドは、この製品リストを解析し、Class.forName( "..")を実行します。

    このようにして、特定の製品をコードする必要はなく、プロパティファイルだけが変更されます。ああ!はい、セキュリティ登録を追加することもプラス点になります。

    注:?私はアイデアを提案しています、I'ventはO_O

    +6

    がどのように '()' ... {} ''静的に仕事に行くのthis.getClassであることを自分自身を試してみました:) –

    関連する問題