beanwrapper (0.7.9) | 2012-01-18 04:36 |
voyager-core-api (0.7.9) | 2012-01-18 04:23 |
xlsmaker-api (0.7.9) | 2012-01-18 04:50 |
xlsmaker-impl (0.7.9) | 2012-01-18 05:01 |
Java SE にはリフレクション機能によりクラスのコンストラクタ、メソッド、フィールド、その他クラスを構成する要素に対して関節参照を行うことができます。Java SE 5.0 でアノテーションが登場し、ランタイムでアノテーションの情報を取得する方法としてリフレクションが拡張されました。また、昨今の Ease of Development(かんたん開発)の実現手段として、リフレクションは欠かせないものとなっています。
一方で、リフレクションは例外処理の煩雑さでも知られます。リフレクション処理においては、様々な種類の例外がスローされる可能性があります。これはリフレクションが必ずしも成功するとは限らないという前提で API が設計されているためです。具体的には、以下の例外がスローされます。
上記に示す通り、Java SE のリフレクション API は、リフレクション処理に失敗した原因を詳細にトレースできるように例外機構を設計しています。しかし一方では、構成管理上リフレクションが成功することが確実な状況下においても、これら多くの例外を処理しなければならず、このことはプログラマーにとって苦痛となります。このような場合の例外処理はあまり意味をなさず、いたずらにソースコードを煩雑にするだけのものとなります。
voyager-api では、リフレクションを Reflector クラスを中心として整理しています。Reflector クラスは、特定のクラスのコンストラクタ、メソッド、フィールドへのアクセスを「委譲」されるもので、そのクラスで宣言されている public コンストラクタと、すべてのメソッド・フィールドに対する統一的なアクセスを提供します。
Reflector クラスは初期化時に委譲元のクラスが宣言するすべてのコンストラクタ・メソッド・フィールドのオブジェクトを読み込みます。これらのオブジェクトはクラスロード時に確定しているため、Reflector クラスの初期化は各クラスについて1回で済みます。Reflector クラスのコンストラクタはパッケージ・プライベートとして宣言されているため、直接 Reflector クラスをインスタンス化することはできず、getReflector ファクトリーメソッドから必要なインスタンスを取得します。
Reflector オブジェクトは、任意のタイミングで委譲元のメソッド・フィールドへのアクセスを提供します。コンストラクタ呼び出し、メソッドまたはフィールドへのアクセス中に何らかの例外が発生した場合には、原因例外をラップした ReflectorException、実行時例外、エラーのいずれかをスローします。これらは非キャッチ例外のため、必要がなければプログラム中で例外処理を行う必要はありません。