[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 メーリングリストの案内