- PR -

リフレクションを利用してクラスの新規作成が出来ますか?

1
投稿者投稿内容
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-07-22 14:48
Javaにリフレクションと言う機能があり、実行時に動的にクラスをロードしたり、名前で指定してメソッドを呼び出したり出来るのは知っています。が、下記のような事は可能でしょうか?

@既存のクラスに動的にメソッドを追加・削除する。
A既存クラスの子クラスとして新しいクラスを作成する。(既存のクラスをインスタンス化するのではなくクラス自体を新しく作成してインスタンス化するんです。)
B@とAで動的に作成・修正されたクラスを保存する。

リフレクションのAPIを参照した限りでは上記の機能はJAVAにはないような気がしますが。。。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-07-22 15:11
質問に対する答えにはなっていないのですが、、、
引用:

B@とAで動的に作成・修正されたクラスを保存する。


保存する、というのはクラスファイルとして保存したいということですか?
もしクラスの自動生成をしたいのでしたら、単にプログラムからソースファイルを
自動生成し、コンパイルしてやれば良いだけだと思いますが・・・。

ちなみに、ご所望のような「実行時に動的にメソッドを追加する」というのは
Javaでは無理な気がします。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2004-07-22 15:20
@は、ちょっと無理そう。
Aは、java.lang.ClassLoader#defineClass()を使えば、「原理的には不可能ではない」。
(実際に実現するのは非常に大変そうですが)
Bは、Aで作成したbyte[]をファイルに保存するだけ?
お犬様
ベテラン
会議室デビュー日: 2003/01/26
投稿数: 67
投稿日時: 2004-07-22 15:29
(1)、(2)、(3) 何れも Jakarta BCEL を使用すれば出来ると思います。業界標準のライブラリだと思われますが、Javaバイトコードの知識がない方には最初はちょっと難しく感じるかもしれません。

(1)、(2) に関して言えば、java.lang.reflect.Proxy で代用できる可能性もあります。
実際に使用できるかはケースバイケースなので具体的に何をしたいかが分からないと判断できませんが。
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2004-07-22 15:36
Javassistってのもあるみたいですねー
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-07-22 16:23
もう回答が出ていますので、別の視点から。。。
javaファイルを動的に生成して、
sun.tools.javacでコンパイル後、
クラスローダで読み込むというのはいかがですか?

以前に私も似たようなことを考えたのですが、(BCEL等)
ソース自体の動的生成の方がデバッグや開発・機能拡張等が楽になると思います。
1

スキルアップ/キャリアアップ(JOB@IT)