greflectプロジェクトのホームページおよびドキュメント一式はこちら
ここはジェネリクス対応JavaリフレクションAPIであるgreflectのプロジェクトWikiです。 ですが、事実上メモ書きページになっています。 なんでって?会社とかからでも記入できるからさ。(笑)
0.11-DRAFTでstatic methodの扱いについて後日改訂版を出すと 宣言した背景について。
正直、static methodについてどう扱うべきか考慮がもれていました。
と言っても現状ではstatic methodも特に制限なく実行することが 可能と思われます。例えば、
long now = api.new Invoker<Long>(
new Param<System>(){}, "currentTimeMillis")
{}.invoke();
と実行すればおそらく何も問題なく実行できるでしょう。 →ガートかけてました。現状実行できません。
それでは、satatic methodとinstance methodを同様に 区別なく実行可能な仕様としてしまえば解決だと思われるかもしれません。 実際、標準ライブラリのjava.lang.reflect.Method.invoke()は satatic methodもinstance methodも区別せず実行できる仕様になっているのだし、 そういうのもアリと言えば有りでしょう。
しかしこのような仕様に倒すことは、(実装上は問題なくても) 仕様上の矛盾を引き起こす恐れがあると判断し、採用を躊躇しています。
satatic methodもinstance methodも区別せず実行できる仕様にするとどうなるのか。 static methodである java.lang.Enum.valueOf() を呼び出すときの例を考えて見ましょう。
enum MyState { SOU, UTSU, FUTSUU };
// :
MyState s = api.new Invoker<MyState>(
new Param<Enum<MyState>>(){},
"valueOf",
new Param<Class<MyState>>(MyState.class){},
new Param<String>("UTSU"){})
{}.invoke();
これがもし次のように記述されていればどうなるでしょうか。
enum MyState { SOU, UTSU, FUTSUU };
enum AnotherState { };
// :
MyState s = api.new Invoker<MyState>(
new Param<Enum<AnotherState>>(){},
"valueOf",
new Param<Class<MyState>>(MyState.class){},
new Param<String>("UTSU"){})
{}.invoke();
実は、この2つの挙動はまったく変わりません。 これはvalueOf() はEnumのメソッドであり、 Enum<MyState>やEnum<AnotherState>に属するわけではないからです。 (注:Javaのジェネリクスの仕様であって、例えばC#は異なる) EnumのメソッドであるのにEnum<AnotherState>とか指定できてしまう、 と言うのは不自然で気持ち悪いと思います。
修正案
enum MyState { SOU, UTSU, FUTSUU };
// :
MyState s = api.new Invoker<MyState>(
new Param<Enum>(){},
"valueOf",
new Param<Class<MyState>>(MyState.class){},
new Param<String>("UTSU"){})
{}.invoke();
のように、型引数を記述しない場合のみstatic method を実行できるようにする。
0.11
0.2
0.3
svn checkout http://svn.sourceforge.jp/svnroot/greflect/trunk/greflect
svn checkout svn+ssh://yo-zi@svn.sourceforge.jp/svnroot/greflect/trunk/greflect
mvn jar:jar
mvn site
mvn clean site assembly:assembly mvn site:deploy注)assemblyは必ずsite実行後に行うこと。
ジェネリクス対応JavaリフレクションAPIであるgreflectの、バージョン0.11ワーキングドラフト改訂版をリリースします。
The working draft revised edition of version 0.11 of greflect - a java reflection API supports generics - is released.
*Version: 0.11-DRAFT
*Branch: trunk
*Revision: 110
修正点
*Reflectionのコンストラクタの説明を追加しました。
*ダウンロードパッケージ(full)にソースツリーを添付するようにしました。
greflectはジェネリック型の型安全性を保障しつつ高速に動作する、 新時代のJavaリフレクションライブラリです。 リフレクションによるオブジェクトの動的な連結に、 ジェネリ ック型の柔軟さを取り入れることができます。 さらにジェネリック型の型安全性(type-safety)を生かした堅牢な プログラミング環境を提供します。
greflect is a new age library of java reflection that holds type safety of generic types. And it is speedy. The flexibility of the generic type can be taken to dynamic linking of objects by the reflection. In addition, Robust-programming environments that makes the best use of type safety of the generic type is provided.
ホームタイトル - A reflection API for generics -
リリースに version tree/revision 表記ついでにワーキングドラフト表記
ジェネリクス機能をサポートした→ジェネリクスをサポートした 類件見直し
catchword linkage 複数形になってない
The specified type 'GenericClass<Integer,String>' is not applicable for type 'GenericClass<String,Integer>'.*"メッセージの妥当性 The instance of type type 'GenericClass<String,Integer>' cannot cast to 'GenericClass<Integer,String>'."メッセージの妥当性
エラーメッセージから specified は取る。ユーザが指定したとは限らないから
Reflectionのコンストラクタの説明
catchword小さく
ソースの同梱
ungeneric:erasure)というテクニックで 実現されており、 これらのオブジェクトはJavaJM上では単にMapやGenericDao クラスのインスタンスとしてnewされます。→うしろ続ける。
概要にはちゃんと概要を書く。
不要(index.html): また、greflectはMaven2リポジトリによって管理されているので、 あなたの開発環境へのビルドインが容易に行えます。
DownloadとRelease順序入れ替えDownloadを上に
SourceForge.jp では、各プロジェクトごとに Wiki システムが利用できるようになりました。 このページも含め、あなたのプロジェクトに合わせて自由に書き換えてください。
システムは現在継続的に開発中です。Wiki本体に関して、問題点や要望などがありましたら、 トラッカー を利用して報告お願い致します。
Wiki ってなに?という方は、 Wikipedia の「ウィキ」のページ を参考にしてください。
文法などのドキュメントは、サイドバーに標準で入っているリンクか、 SourceForge.jp プロジェクト内の Wikiガイド を 参照してください。