[Seasar-user:6433] Re: 存在しないクラスをコンポーネントに

o.h. [E-MAIL ADDRESS DELETED]
2007年 3月 1日 (木) 17:48:31 JST


長谷川です.

小林さんありがとうございます.

Koichi Kobayashi wrote:
>> で、そのシステムには ClassLoader#findClass で特定の名前のクラス
>> が指定された場合(実際には存在しないクラス名)既存のクラスを継承
>> したクラスを作成するような仕組みが入っています.

> 
> 「特定の名前のクラス」が,固有のインタフェース
> あるいは抽象クラスを持っているなら可能です.
> 
> SMART deploy では (というか COOL deploy では),
> クラスファイルが見つかると,それを自動登録
> するようになっています.
> そのため,インタフェースでも抽象クラスでも
> 構わないのですが,コンポーネントとして
> 認識するためのクラスファイルが必要です.
> 

deploy 時にクラス自体を生成するのは無理そうだとは思ってましたが
しょうがないですね.

私自身、seasar を使い始めて間もないため、機能が把握し切れていません.
で、やりたいこと(もとシステムで行っていたこと)は以下のようなことなの
ですが seasar ではこうすればいいとかこの機能は実現されていて
こうするべきだ、などのアドバイスをいただけないかと.

やっていることは ResourceBundle の元ねたを DB などの外部リソースから
取得することで、以下のようにして実現しています.

1.Thread.setContextClassLoader であらかじめ ClassLoader を設定

2.ClassLoader の findClass まで落ちてきたら、名前によって外部
    リソースを読み込むためのクラスを作成する
    #リソース名なんで mes_ja やら foo_en といった名前になります

3.このクラスは ListResourceBundle っぽいベースの抽象クラスを元に
    して名前を変えたり属性を変えたりしている
    #CtClassPool からベースの CtClass をとってきてそれを編集

4.クラスを ClassLoader にロードし、その static なフィールドに
    リソースの元となるオブジェクトを設定する

5.findClass の結果として上記のクラスを返す
    #mes_ja.class やら foo_en.class やら

で、要するに同じベースのクラスを名前をかえて静的フィールドを設定して
ResourceBundle.getBundle から普通のリソースとして読めるようにしてしまう
ってところです.

現在のところ、このリソースの元が S2Dao でデータを取るようになって
います.

#この仕組みだと、インスタンスの生成は ResourceBundle 側で行う形と
#なるため seasar のコンポーネントの概念とはあわなさそうではありますが

まったくこの仕組みにはこだわってはいませんので、いい方法がありましたら
アドバイスをいただきたく.

以上、よろしくお願いいたします.
-- 
_/_/
_/_/ mailto: [E-MAIL ADDRESS DELETED]
_/_/ (deprecated: [E-MAIL ADDRESS DELETED])
_/_/



Seasar-user メーリングリストの案内