- - PR -
リフレクションを利用してクラスの新規作成が出来ますか?
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-07-22 14:48
Javaにリフレクションと言う機能があり、実行時に動的にクラスをロードしたり、名前で指定してメソッドを呼び出したり出来るのは知っています。が、下記のような事は可能でしょうか?
@既存のクラスに動的にメソッドを追加・削除する。 A既存クラスの子クラスとして新しいクラスを作成する。(既存のクラスをインスタンス化するのではなくクラス自体を新しく作成してインスタンス化するんです。) B@とAで動的に作成・修正されたクラスを保存する。 リフレクションのAPIを参照した限りでは上記の機能はJAVAにはないような気がしますが。。。 | ||||
|
投稿日時: 2004-07-22 15:11
質問に対する答えにはなっていないのですが、、、
保存する、というのはクラスファイルとして保存したいということですか? もしクラスの自動生成をしたいのでしたら、単にプログラムからソースファイルを 自動生成し、コンパイルしてやれば良いだけだと思いますが・・・。 ちなみに、ご所望のような「実行時に動的にメソッドを追加する」というのは Javaでは無理な気がします。 | ||||
|
投稿日時: 2004-07-22 15:20
@は、ちょっと無理そう。
Aは、java.lang.ClassLoader#defineClass()を使えば、「原理的には不可能ではない」。 (実際に実現するのは非常に大変そうですが) Bは、Aで作成したbyte[]をファイルに保存するだけ? | ||||
|
投稿日時: 2004-07-22 15:29
(1)、(2)、(3) 何れも Jakarta BCEL を使用すれば出来ると思います。業界標準のライブラリだと思われますが、Javaバイトコードの知識がない方には最初はちょっと難しく感じるかもしれません。
(1)、(2) に関して言えば、java.lang.reflect.Proxy で代用できる可能性もあります。 実際に使用できるかはケースバイケースなので具体的に何をしたいかが分からないと判断できませんが。 | ||||
|
投稿日時: 2004-07-22 15:36
Javassistってのもあるみたいですねー
| ||||
|
投稿日時: 2004-07-22 15:55
参考
AspectJ Tips and Pitfalls http://www.oucc.org/~tail/aspectj/ Decorator としてのアスペクト あたりを起点にして POJO とか、似たような動作をする ものを辿るとよいのでは ================== 面白ネタ XMLでコードのハンドリング(バイナリー構造より扱いやすいか?) Introducing o:XML http://www.xml.com/lpt/a/2004/07/21/oxml.html 似たようなのありそう [ メッセージ編集済み 編集者: MMX 編集日時 2004-07-22 16:37 ] | ||||
|
投稿日時: 2004-07-22 16:23
もう回答が出ていますので、別の視点から。。。
javaファイルを動的に生成して、 sun.tools.javacでコンパイル後、 クラスローダで読み込むというのはいかがですか? 以前に私も似たようなことを考えたのですが、(BCEL等) ソース自体の動的生成の方がデバッグや開発・機能拡張等が楽になると思います。 | ||||
1
