[Java]を動的ロード

いいえグラバター

プログラムは非常に頻繁に(たとえば、いずれかのアプリケーションのプラグインなどの可能性を考慮すると、すぐに"インストール後に")我々を参照して使用しなければならない必要があるシステムでの使用中にコードの追加部分を挿入を感じるどのように何の制限は、この日の言語でも達成可能である

実行時にコンパイル:

まず、そこから任意のJavaアプリケーション()は、通常のパラメータとのjavacコンパイラを呼び出すことを知って便利です(クラスパスと他のすべて)で、単純な

コードの表示 ] ジャワ
  new String [ ] {メイン コンパイル 新しい String [](
 , の"- d"の"bin /"、
 filename + ".java" } ) ; は"src / generatedCode /"+ ァイル名+"java"の)); 

注意:各種パラメータ(私は)私のAPIのドキュメントを残して、コンパイルのオプションを含む多くの左側

読み込んでいます:

なぜなら、ファイルがあります。私たち二道路が我々のアプリケーションは、仮定から、私たちはクラスの名前を知ってスタートをロードするからクラス:

  1. もし我々の反射とインスタンスメソッドのメカニズムを介してクラスを推論に関する特定の情報を持っていない;
  2. もし我々が知られてインターフェイスを実装するための"プラグイン"の構造が(私たち、まもなく)を参照しなければならないし、インターフェイスのメソッドを呼び出すオブジェクトをインスタンス化します。

これ以外にもはるかにそれる2私の場合検討していくのは非常に複雑であり、興味深い反射件名。

は、次の場合を考えます:

クラス A(1たちをロードする)Bのインターフェイスを実装します。

コードの表示 ] ジャワ
  new ClassLoader ( ) ; ClassLoaderをローダ= 新しい ClassLoader();
 gt ; cls = loader. loadClass ( "A" ) ;クラス&LTの;?&グアテマラ;分類=ブートローダーがあります。LoadClass("");
 B ) cls. newInstance ( ) ; Istanza_di_AのB =(Bの)分類。newInstance()を;
 ... ) ; istanza_di_A。metodoDiA (...); 

このようにプロセスを見ることができる、非常に実装するために、単純な性は、今何が主な制限を見てみましょう。

UnloadingReloading:

残念なことには、JVMを許可しない場合にバイトコードをロードされたクラスのアンロード。
かつて私たちのプログラムで、その型のオブジェクトをインスタンス化した後は、クラスのコードの改正のアイデアを考えてみましょう。 我々として、クラスを変更するのは、一度読み込まれたバイトコードとコンパイル型の新しいオブジェクトの"A"が作成されます自然に見えるであろうが、最新のバージョンが利用可能になった。

残念ながら、この現象が発生しない場合は、なぜしてください。
これまで我々充電"を"私たちのクラスのバイトコードのメモリ内の実行時に使用するクラスローダを、我々(手動または自動)を処理することができないとしているクラスのインスタンスのアプリケーションをアンロードする。 オブジェクトの作成時には、単に次のアルゴリズムに従うことです(これは実行が非常に簡体字):

  1. チェックデータ構造(ハッシュテーブル)がある場合は、クラスが、彼はクラス名("class_nameで" - ""バイト")行くことで、負荷に頼まれたのエントリです。
  2. 場合は、名前に一致するエントリを見つけることができ、1つ作成し、ファイルの読み込み後のクラス、そのような構造体のバイトコードを保存し、プログラムのインスタンスを返します。
  3. また、もし、クラス名のエントリを見つけるかどうかは、バイトコードかどうか更新され評価するためにいかなる方法でも心配していないですからオブジェクトのインスタンスをバイトコードを保存し、プログラムに返されます。

このようにして、変更する場合にのみ、プログラムを再起動が有効になります想像することができます。
現存する唯一のソリューションは、カスタムClassLoaderを我々のプラグインとして使用すると、1回の変更が発生した、我々"退席中"(nullにすべての参照を配置する)で投げることができる場合caricareistanziareクラスを使用する場合は契約を実装することですそのプライベートなデータ構造では、新しいコードを管理するの面倒を見る、新しいアプリケーションのreinstanziarene。

面倒な本当の解決? さて、もし彼もTomcatのJSPはそれを調整することが適当であると思いますMENDMENTSを更新する場合 :)

人気:19%[?]

キーワード: を、


leave a response , or trackback from your own site. あなたは RSS 2.0の 供給を通してこの記入項目への応答に従うことができます。あなたが自分のサイトから の応答、 または trackbackトラックバック を残す ことができます。

AddThisの社会的なしおりボタン

このウェブサイトはしかし、IntenseDebateのコメントを使用して、現在のいずれかのブラウザがJavaScriptをサポートしていないか、または十分な速度が読み込まれなかったため、ロードされていません。

返信コメントを残す