眺め読み #8 RTTI

EclipseJava環境用プラグインを作るときは、クラスやメソッドに対応するオブジェクトを使います。org.eclipse.jdt.coreパッケージにある、ITypeやIMethodなどです。ITypeは普通のJavaでのjava.lang.Classを多機能にしたような物です。
KijimunaのRTTIとは、ITypeやIMethodなどをより使いやすくした物で、Diconエレメントや、OGNLの要素なども統合した物です。
まずはインタフェースは、まぁ、名前の通りです。

package org.seasar.kijimuna.core.rtti;

IRtti
IRttiFieldDescriptor
IRttiPropertyDescriptor
IRttiInvokableDesctiptor
+ IRttiConstructorDesctiptor
+ IRttiMethodDesctiptor extends

上記を実装しているクラスは、次の通り。

package org.seasar.kijimuna.core.internal.rtti;

// IType(クラス、インタフェース)に対応
DefaultRtti implements IRtti

AbstractRttiValuableDescriptor
  // 属性
+ DefaultRttiFieldDescriptor implements IRttiFieldDescriptor

  // プロパティ
+ DefaultRttiPropertyDescriptor implements IRttiPropertyDescriptor

AbstractRttiInvokableDescriptor implements IRttiInvokableDesctiptor
  // コンストラクター
+ DefaultRttiConstructorDescriptor implements IRttiConstructorDesctiptor

  // メソッド
+ DefaultRttiMethodDescriptor implements IRttiMethodDesctiptor

その他のDiconエレメントに対応するRTTIクラスは、次のような感じ。

RttiWrapper implements IRtti
  // <component>のキー
+ ComponentKeyRtti implements IComponentKey

  // <components>
+ ContainerRtti

  //
+ DirectAccessedRtti implements IDirectAccessed

  // 
+ InjectedRtti

OGNLの要素については、インタフェースは無いようです。

package org.seasar.kijimuna.core.rtti.ognl;
OgnlRtti

// org.ognl.el.Extensionsを継承
package org.seasar.kijimuna.core.internal.rtti.ognl;
OgnlExtensions extends Extensions

RTTIを取得するには、RttiLoader.loadRtti(declareName)を使います。declareNameには、データ型の完全クラス名か、プリミティブ名を指定します。その際に、キャッシュを使い同じRTTIの取得を高速化しています。

package org.seasar.kijimuna.core.internal.rtti;
DefaultRttiCache implements IRttiCache

または、diconエレメントに対して、getAdapter(IRtti.class)として取得します。この場合は、そのエレメントに対応したRTTIが取得されます。