JDK 7 のコンパイラ API に気付きました。これは、Java プログラムが実行中のプログラムの定義を再コンパイルして変更できるということですか?
現時点では、JavaRebel のような製品がこれを実行できることはわかっていますが、製品の無料ダウンロードを提供するには、有料の製品である Javarebel は除外されます。
コンパイラ API は Java 6 ですでに利用可能です。
すでにロードされているクラスのコードを変更することはできません。ホット コード置換は引き続きデバッグに限定されますが、Java アプリケーションからソース コードをコンパイルし、実行時に新しく作成されたクラスをロードすることはできます。
私の知る限り、Java 7 には自己変更の追加メソッドは導入されていません。
一部の影響は、コンパイラ API および を使用してすでに実行ClassLoaders
できますが、他の一部はJVM TIを使用して実行できます。
しかし、私の知る限り、Java 7 はこれらの API に大きな変更を加えていません。
現在 Open JDK 7 の一部ではありませんが、JRebel のようなクラス再ロード機能を OpenJDK 7 に追加するプロジェクトがあります: Dynamic Code Evolution VM (DCEVM)
これは、通常のJVMTIクラスの再定義メカニズムを通じて機能します。
はい、可能です。1 つの方法は、専用のクラスローダーを作成し、ASM などのバイトコード拡張ツールを使用して、実行時にアプリケーションの一部を変更することです。javaagent
また、a and againなどを使用して同じことを達成することもできASM
ます。
Javeleonは、これらの線に沿った機能を提供します。無料で入手できますが、自由に再配布することはできません。
コンパイラ API (JSR 199) は、コードのリロードや自己変更とはほとんど関係ありませんが、何らかの方法で新しいバイトコードをロードしたいプログラムが、アセンブラ API を使用するのではなく、199 を使用して Java ソースからそのバイトコードを構築する場合を除きます。 ASMのように。
アップデート:
zeroturnaround (JRebel の作成者) によって取得されたため、Javelon は使用できなくなったようです。
ジャベロンのホームページから:
注: Javeleon はスタンドアロン製品としてダウンロードできなくなります。