2011-10-28 15 views
2

特定のクラスをシステムに登録する必要があるレジストリクラスがある場合があります。私はAPIを書いているので、ランタイムの前にこれらのクラスがあるかどうかを必ずしも知ることができないので、私の解決策は各クラス内の静的ブロックを使用して自身を登録しています。実行時にクラスを強制的にロードする方法はありますか?

問題は、各クラスが初期化されるまで静的なブロックが実行されていないのは勿論である、そして個々のクラスへの明示的な言及がないので、彼らは決して初期化されていません。 Catch-22。

したがって、クラスを明示的に参照せずに起動時に初期化されるようにする方法や注釈はありますか?

+0

クラスを初期化するために 'Class.forName(" com.example.MyClass ")'を呼び出すことはできますか?パラメータとして 'initialize'フラグをとる別の' Class.forName'メソッドもあります –

+0

私が言ったように、私のコードはあらかじめクラスを認識していません。私はそれを明示的に呼び出すことができますが、問題はありません=) – mikek

+0

クラス名を表示するために、Javaプロパティまたは設定ファイルを使用して、自分で読み込むことができますか? *は、特定のJava Virtual Machine(JVM)*のアプリケーションで一度インスタンス化されることが保証されている新しい種類のセッションBeanである '@ Singleton'ビーンアノテーションを使用できますか? –

答えて

1

たとえば、@Component注釈を使用するか、実行時に注釈付きクラスのサブクラスの場合はscanを使用します。これには春を使用したり、自分でそのような機能を実装したり、scannotationなどの専用ライブラリを使用することができます。あなたは春に見てすることを決定した場合

は、あなたが指定された注釈付きクラスをスキャンするために豆ClassPathScanningCandidateComponentProviderスタンドアロンで使用することができます。あなたは、コンテナ環境のいくつかの並べ替えで実行していない場合

+0

いい考えですが、この場合はEJB3.0に固執しています。 – mikek

1

(例えばOSGIを使用して、春、Guiceのなどが...)、それが明示的にすることなく、まだ一般的な方法はありません。あなたはつまり、誰かが例えば実行する必要が

、特定のJDBCドライバライブラリのユーザは、ドライバを使用する前に初期化されていることを確認するために持っているでは、JDBCのアプローチを取ることができます Class.forName("org.postgresql.Driver");、これはorg.postgresql.Driverクラスをロードします。そのクラスでは、静的なイニシャライザを使用して、必要な他のすべてのクラスをロード/登録することができます。

+0

EJB3.0は私が保証できる唯一のコンテナです。これらのクラスは、EJBコンテキストでは明示的ではありません。 – mikek

+1

EJB3には、servletcontextlistenerを数えない限り、イニシャライザフレームワークもありません。 – Renan

関連する問題