-RTTI & OGNL

Eclipseプロジェクト内のクラスを自由にツリーウォークするために作っていたKijimuna-RTTIですが、ほぼ完成。OGNLの対応はもうすこしで完成。http://www.kjps.net/user/kurihara/ にアップしておきました。コードを整理して、名前解決の特殊ケースでバグだったものを修正しましたので、およその用途には問題ないかと思います。今回のOGNL対応では以下のようなAPIを用意しました。

OgnlRtti
public static Rtti getValue(String expression, Rtti root) throws OgnlException
public static Rtti getValue(String expression, Map context, Rtti root) throws OgnlException

また、RttiLoaderは以下の感じです。

RttiLoader
public RttiLoader(IJavaProject project, boolean autoConvert)
public IJavaProject getProject()
public boolean isAutoConvert()
public String getRootName()
public Rtti loadRtti(Class clazz) throws RttiNoSuchElementException
public Rtti loadRtti(String declareName) throws RttiNoSuchElementException

中核のRttiは以下です。

Rtti
public RttiLoader getRttiLoader();
public boolean isPrimitive();
public boolean isArray();
public String getName();
public boolean isInterface();
public boolean isAssignableFrom(Rtti testRtti);
public Rtti getArrayItemClass() throws RttiException;
public Rtti getInterfaces() throws RttiException;
public Rtti getSuperClass() throws RttiException;
public Rtti invoke(String methodName) throws RttiException;
public boolean hasSetterMethod(String property, Rtti arg) throws RttiException;
public boolean hasGetterMethod(String property) throws RttiException;
public boolean hasMethod(String methodName, Rtti args) throws RttiException;
public Rtti getProperty(String property) throws RttiException;
public Rtti getMember(String member) throws RttiException;

ユーザー(?)が触るものは以上だけです。それも、RttiLoaderのコンストラクタとloadRtti()メソッド、OgnlRttiのstaticなメソッドのどちらかで目当ての結果が取れます。

RttiLoader loader = new RttiLoader(project, false);
Rtti root = loader.loadRtti("test.Person");
Rtti value = OgnlRtti.getValue("parent.name", root);
String name = value.getName;

これで、とれたnameの値は、"java.lang.String"となってます。test.Personがプロジェクト内のソースだとリフレクションできないので、こういう手続きが必要なのです。