JDK 7は、プログラムが独自のコードを変更することを許可しますか?
質問
JDK 7のコンパイラAPIに気づきました。これは、Javaプログラムが実行中のプログラムの定義を再コンパイルして変更できることを意味しますか?
現時点では、Javarebelのような製品がこれを行うことができることを知っていますが、製品の無料ダウンロードを提供するには、製品に対して支払われるJavarebelを除外します。
解決
コンパイラAPIは既にJava 6で利用可能です。
すでにロードされたクラスのコードを変更することはできません - ホットコードの交換は引き続きデバッグに制限されますが、Javaアプリケーションからソースコードをコンパイルし、実行時に新しく作成したクラスをロードできます。
他のヒント
はい、それは可能です。 1つの方法は、特殊なクラスローダーを作成し、ASMなどのバイトコード拡張ツールを使用し、実行時にアプリケーションの部分を変更することです。同じことを使用して達成することも可能です javaagent
そしてまた ASM
または似たようなもの。
私が知る限り、Java 7は自己修正の追加方法を導入していません。
いくつかの影響は、コンパイラAPIを使用してすでに実行できます ClassLoaders
, 、他のいくつかはを使用して実行できます jvm ti.
しかし、私が知る限り、Java 7はこれらのAPIに大きな変更をもたらしません。
Jrebelのようなクラスのリロード機能をOpenJDK 7に追加するプロジェクトがありますが、現在はOpen JDK 7の一部ではありません。 動的コードの進化VM (DCEVM)
それは通常の状態で動作します jvmti クラスの再定義メカニズム。
ヤブレオン これらの線に沿って機能を提供します。無料で利用できますが、自由に再配布できません。
コンパイラAPI(JSR 199)は、アセンブラーAPIを使用するのではなく、Javaソースからそのバイトコードを何らかの方法でロードするために199を使用する可能性があるプログラムとしての場合を除き、コードのリロードや自己修正とはほとんど関係ありません。 ASMのように。
アップデート:
Zeroturnaround(Jrebelの作成者)に買収されたため、Javelonは利用できなくなったようです
ジャベロンホームページから:
注:Javeleonは、スタンドアロン製品としてダウンロードできなくなります。