2012年5月7日月曜日

Introspector

Introspector クラスは、ツールに対して、ターゲット Java Bean がサポートするプロパティー、イベント、メソッドを調べる標準的な手法を提供します。

Introspector は、上記の 3 種類の情報について、Bean のクラスとスーパークラスを別々に分析し、明示的あるいは暗示的な情報を見つけ出し、その情報を使ってターゲットの Bean を包括的に記述する BeanInfo オブジェクトを構築します。

Foo クラスについては、情報の問い合わせ時に null 以外の値を提供する FooBeanInfo クラスがあれば、明示的な情報を取得できます。まず、ターゲットの Bean クラスの完全指定されたパッケージ名に「BeanInfo」を付加して新規のクラス名とし、BeanInfo クラスを検索します。これに失敗した場合は、この完全指定されたパッケージ名の最後のクラス名にあたる部分を使って、BeanInfo パッケージ検索パスに指定されたパッケージごとに該当クラスを検索します。

このように、たとえば sun.xyz.OurButton というクラスの場合、まず sun.xyz.OurButtonBeanInfo という BeanInfo クラスを検索し、見つからない場合は BeanInfo 検索パス内のパッケージごとに OurButtonBeanInfo クラスを検索します。デフォルトの検索パスの場合は sun.beans.infos.OurButtonBeanInfo になります。

クラスが明示的な BeanInfo を提供する場合は、これを分析クラスおよび派生クラスから取得した BeanInfo 情報に追加します。明示的な情報は、現在のクラスとその基底クラスに関する信頼できる情報と見なせるので、スーパークラスの連鎖の検索は行いません。

クラスの明示的な BeanInfo が見つからない場合は、低レベルのリフレクションを使ってクラスのメソッドを調べ、標準設計パターンを適用して、プロパティーのアクセス用メソッド、イベントソースメソッド、public メソッドを識別します。次に、クラスのスーパークラスを分析し、この情報を追加します。このとき、スーパークラスの連鎖をさかのぼる可能性もあります。

Introspector は、パフォーマンスの向上の目的で BeanInfo クラスをキャッシュするため、複数のクラスローダーを使用するアプリケーションで Introspector を使用する場合は注意してください。一般に、クラスのイントロスペクションを実行するために使用した ClassLoader を破棄するときは、Introspector.flushCaches または Introspector.flushFromCaches メソッドを使用して、イントロスペクションされたすべてのクラスをキャッシュからフラッシュするようにしてください。

イントロスペクションおよび設計パターンの詳細については、「JavaBeans specification」を参照してください。

0 件のコメント:

コメントを投稿