1

JDK 7 のコンパイラ API に気付きました。これは、Java プログラムが実行中のプログラムの定義を再コンパイルして変更できるということですか?

現時点では、JavaRebel のような製品がこれを実行できることはわかっていますが、製品の無料ダウンロードを提供するには、有料の製品である Javarebel は除外されます。

4

5 に答える 5

8

コンパイラ API は Java 6 ですでに利用可能です。

すでにロードされているクラスのコードを変更することはできません。ホット コード置換は引き続きデバッグに限定されますが、Java アプリケーションからソース コードをコンパイルし、実行時に新しく作成されたクラスをロードすることはできます。

于 2011-03-15T10:40:54.700 に答える
3

私の知る限り、Java 7 には自己変更の追加メソッドは導入されていません。

一部の影響は、コンパイラ API および を使用してすでに実行ClassLoadersできますが、他の一部はJVM TIを使用して実行できます。

しかし、私の知る限り、Java 7 はこれらの API に大きな変更を加えていません。

于 2011-03-15T10:42:01.943 に答える
3

現在 Open JDK 7 の一部ではありませんが、JRebel のようなクラス再ロード機能を OpenJDK 7 に追加するプロジェクトがあります: Dynamic Code Evolution VM (DCEVM)

これは、通常のJVMTIクラスの再定義メカニズムを通じて機能します。

于 2011-03-19T15:58:13.570 に答える
3

はい、可能です。1 つの方法は、専用のクラスローダーを作成し、ASM などのバイトコード拡張ツールを使用して、実行時にアプリケーションの一部を変更することです。javaagentまた、a and againなどを使用して同じことを達成することもできASMます。

于 2011-03-15T10:40:37.563 に答える
2

Javeleonは、これらの線に沿った機能を提供します。無料で入手できますが、自由に再配布することはできません。

コンパイラ API (JSR 199) は、コードのリロードや自己変更とはほとんど関係ありませんが、何らかの方法で新しいバイトコードをロードしたいプログラムが、アセンブラ API を使用するのではなく、199 を使用して Java ソースからそのバイトコードを構築する場合を除きます。 ASMのように。

アップデート:

zeroturnaround (JRebel の作成者) によって取得されたため、Javelon は使用できなくなったようです。

ジャベロンのホームページから:

注: Javeleon はスタンドアロン製品としてダウンロードできなくなります。

于 2011-12-09T15:49:06.997 に答える