BeanDesc#getXxxParameterNames()
Seasar2 の org.seasar.framework.bean.BeanDesc
でメソッドやコンストラクタの引数名を取れるようになりました.
次のメソッドを用意しています.
String[] getConstructorParameterNames(Class[] parameterTypes)
String[] getConstructorParameterNames(Constructor constructor)
String[] getMethodParameterNames(String methodName, Class[] parameterTypes)
String[] getMethodParameterNames(Medhod method)
使い方は見たまんま.
ただし,コンストラクタもメソッドも BeanDesc の扱うもの,つまり public
なものしか扱えません.
取ろうと思えば private
でも取れるのですが,BeanDesc
に機能を持たせた都合上そうしています.
これらのメソッドは Javassist を使ってデバッグ情報にアクセスすることで実現しています.
このため,デバッグ情報なしでビルドされたクラスからは引数名を取得することができません.
実はこれ,S2AOP を Javassist 対応した昨年から実現できたはずなんですよね.
デバッグ情報に引数名が入っていることは以前から知っていたのですが,そこから引数名を取得するには Java Platform Debugger Architecture (JPDA) を使わないとダメだと勝手に思いこんでいて,その使い方が分からなかったので放置していた次第.
でもでも,Javassist でもちゃんと取れたんですね.しかも簡単だった...
心より恥じる.
現在のところ,トランク (S2.4 系) にのみコミットしていますが,ブランチ (S2.3 系) にもマージしたいと考えています.
従来 S2AOP に含まれていたユーティリティや例外クラスを移動したりしたので,既存の利用者に多少の影響があるかもしれませんが,メリットの方が大きいだろうということで.
これで S2Dao の ARGS アノテーションを指定する必要性がほとんどなくなるはず.
Kuina-Dao でも活用しますよ♪
例えば,
Collection
find(String name)
なんてシグネチャのメソッドから
select employee from Employee employee where employee.name = ?1
のような JPQL (Java Persistence query language) を生成したり.
さらに
Collection
find(String department$name)
のように '$
' で区切った引数名を使うことで,
select employee from Employee employee where employee.department.name = ?1
のように関連先のエンティティを検索条件に加えることも実現したいと考えてます.アノテーションすら必要なし!!
他にもアイディアがいろいろ出てきそう.
BeanDesc#getXxxParameterNames()
活用してください♪