2009-06-26 16 views

答えて

9

悲しみの世界を無視すると、自己修正コード(!

  1. リロード/再コンパイル/ Javaの6の作り付けのコンパイラのサポートを使用し、書き込みのクラス
  2. あなたのクラスを記述するようにApache BCELバイトコード操作ライブラリを使用して直接
  3. :)、3つのオプションがあるように思えます、(要件の不存在下で)私の最初の選択でしょうJavaの6の作り付けのスクリプトのサポートを利用する(またはApache BSFを使用)選択のあなたのJVMのスクリプト言語のメソッドを書くこと、および上記の3つのこれらの

を実行しますタになるオプション3を見てください。私はそれが始めるのが最も辛い方法だと思っています。私は上記のすべてを使用しました - 残念ながら私はクライアントコードへのリンクを投稿することはできません。

+0

BCELの代わりにobjectweb ASM [http://asm.ow2.org/] – KitsuneYMG

1

これは実現が難しいはずです。しかし、実行時に新しいクラスを作成し、カスタムクラスローダーでそれらをロードすることができます。コードを再度変更する場合は、クラスをリロードする必要があります。

+0

を投稿してください。それはかなりファクトリメソッドになります! – akf

-2

あなたは常にだけで動的言語を使用することができます...

+0

私はこの質問が退屈から出されたと思うので、あなたは答えが正しくないかもしれません。 – IAdapter

+2

-1なぜJava –

+0

Java言語またはJava仮想マシンに関する質問が明白だったのでしょうか?両者には大きな違いがあります。 – OOPMan

1

BCELから:

バイトコードエンジニアリングライブラリは、分析の作成、および を操作するために、ユーザー に便利な可能性を与えることを目的としている

(バイナリ)Javaクラスファイル(.classで終わるもの)。 クラスは、指定されたクラスのすべての シンボル情報(メソッド、フィールド、および バイトコード命令)を含むオブジェクトで表されます。

+0

私は本当にジェレミーを得られなかった。あなたは現在の状況で話していますか? –

+1

BCELは、新しいクラスを生成したり操作したりするのに役立ちます。 2つ目は、Javaに組み込まれている新しいクラス、reflection-APIをロードすることです。 – Mnementh

1

私は、この目的のために、これらのオプションを参照してください。(名前を思い出すことができない)Javaソースコードを生成し、外部のjavacまたは内部コンパイラツールでコンパイル

  • を。また、名前の責任を負うので、クラスの読み込みの異常を避けるために、クラス名にバージョンカウントを含めてください。
  • JavaScriptエンジンのサポート
  • に建てられたいくつかのシナリオでは、Javaのproxys

編集を使用して解決することができます使用します。私は一度、既存のレガシーデータベースからビジネス・ルールを取ったJava 1.4プログラムを作成し、Javaの生成をファイル(基本的にはPredicateインターフェースの実装)をprintln()から束ね、それらをコンパイルするためにコマンドラインjavacを使いました。

1

bcelのようなライブラリを使用して、実行時に新しいクラス(バイトコード)を生成する(Java)コードを記述できます。それは自己修正コードと全く同じではありません。自己修正コードは、JVMがサポートしているものではないと思われます。

実行時に新しいコードを生成する例については、ソースコードclojureを見てください。

0

私はJikesRVMで作業しなければなりません。これはJavaで実装された(ほとんどの)JVMです。実行時にJITコンパイルが実行されます。それは本当にクールな技術です。