yohjizzz's Blog

I'm a Programmer.

総称型(Generics)は取得できない…?

Seasar も Spring もいいんだけど、、
なんか DI の為だけに開発者がインターフェイスつくるってルールもなんかなぁって思う今日この頃…。

生産性、生産性…って言うなら、インターフェイス(の作成)を省く手段を考えるのもいいかなってことで、
javassist」使って、POJOのロジックからインターフェイスを自動生成する Eclipse のビルダーでも作ってみようかと。


んで、サンプル↓作ってみたところ、、、

    CtClass ctClass = classPool.get("hoge.logic.impl.HogeLogicImpl"); // 実装済みの POJO …
    CtMethod[] ctMethods = ctClass.getMethods();
    
    CtClass ctInterface = classPool.makeInterface("hoge.logic.HogeLogic"); // 仮想のインターフェイス…
    
    for (CtMethod ctMethod : ctMethods) {
        
        if (!ctMethod.getDeclaringClass().getName().equals(target)) { continue; }
        if (ctMethod.getModifiers() != Modifier.PUBLIC) { continue; }
        
        CtMethod newMethod = new CtMethod(ctMethod.getReturnType(), ctMethod.getName(), ctMethod.getParameterTypes(), ctInterface);
        ctInterface.addMethod(newMethod); // インターフェイス化したいメソッドのみを登録…
    }
    
    ctClass.setInterfaces(new CtClass[] {ctInterface});
    
    ctInterface.stopPruning(true); // インターフェイス情報を凍結させて…
    ctInterface.writeFile("out"); // バイトコード(classファイル)を生成…
    
    ctClass.stopPruning(true); // クラス(POJO)情報を凍結させて…
    ctClass.writeFile("out"); // バイトコード(classファイル)を生成('implements HogeLogic'を追加)…

おっ!いいじゃん♪ と思いきや。CtClass は総称型の情報が取得できねーの…

たとえば POJO に、

    public List<HogeDto> findHogeAll() { ... }

ってのがあったとしても javassist で抽出できるメソッド情報は、

public List findHogeAll() { ... }

どーゆーこと!?と思いきや、

Genericsの罠 再び - ありえるえりあ

Java Genericsの総称型はコンパイル時にのみ解釈され、バイトコードには総称型であったという痕跡すら残りません。
仕様的に残さないことになっているため、実行時に総称型オブジェクトの型パラメータを知る方法はありません。

基本だね。。。いったん break 。


そーいやぁ、Seasar 2.5 では、ガチガチの「インターフェイスしばり」から解放してくれるっぽい。

うそでした。。
Seasar 2.4 では、インターフェイスを実装しないPOJOのコンポーネントの自動登録可能、もちろん AOP の適用も可能(ポイントカットは明示的にね!)。

ひがやすを blog - Seasar2.5におけるブルーオーシャン戦略