60

1つのクラスだけで構成される簡単なJavaプログラムがあると仮定します。

public class HelloWorld {

   private static void replacable(int i) {
      System.out.println("Today is a nice day with a number " + i);
   }        

   public static void main(String[] args) throws Exception {
      for(int i = 0; i < 100000; ++i) {
      replacable(i);
      Thread.sleep(500);
   }
}

コンパイルして実行すると、出力は次のようになります。

今日は数字が0のいい日です

今日はナンバーワンのいい日です

今日は2番のいい日です

今日は3番のいい日です

..。

私の質問:実行時にメソッドを交換する方法はありますか(または近い将来にありますか) replacableHelloWorldの新しいバージョンで別のバージョンをreplacable作成し、それをコンパイルしてから、すでに実行中のJVMで古いバージョンをコンパイルするようなものですか?

したがって、次のように新しいバージョンを作成すると、次のようになります。

private static void replacable(int i) {
   System.out.println("Today is an even nicer day with a number " + i);
}  

私がこれを行うことができるErlangのホットコードスワッピングに似たものはありますか?

  1. オリジナルプログラムを実行する
  2. 修正版を書く
  3. コマンドラインプログラムを使用して、実行中のJVMに接続し、既存のメソッドを置き換えます

そのため、実行時にこれが発生します。

今日は15000番のいい日です

今日は15001という数字のいい日です

今日は15002という数字でさらに良い日です

今日は15003という数字でさらに良い日です

..。

上記のプログラムがスタンドアロンであり、標準のJava SE環境で実行され、クラスパス上に他に何もないため、ほぼHelloワールドスタイルのプログラムであると想定します。

注:バイトコード操作(cglib)、aspectJjRebelJMX、Java EEのメソッドのホットスワップなどのテクノロジーが存在することは知っていますが、それらは私が考えているものではありません。Erlangについて考えてみてください。

4

7 に答える 7

40

オープンソースのHotSpotVMまたは商用のJRebelIDEプラグインを使用して、目標を簡単に達成できます(比較表はこちらをご覧ください)。

于 2011-01-03T07:46:19.740 に答える
15

クラスローダーを介してそれを行うことができます。たとえば、開発中にページを変更するときにページをリロードするTomcatなどのサーブレットコンテナに精通している場合です。これは、Javaで動的コードを作成するための優れた説明です。ロードだけでなく、ソースをその場でコンパイルする方法についても説明します。カバーされている概念を、利用したいコードをリロードするあらゆる戦略に適用できるはずです。

于 2010-12-29T20:13:23.973 に答える
9

私はこのホットスワップantタスクを多くのプロジェクトで使用しました。ターゲットJavaアプリケーションは、適切なポートを開いた状態でデバッグモードで起動される限り、Ant、Eclipse、コマンドプロンプト、またはその他の手段で起動できます。リンク先のページには、Antを介してこれを行う方法の説明があります。

変更が構造的でない限り、任意の数のクラスをホットスワップできます。メソッド本体の変更は、通常、簡単にホットスワップされます。シェルまたはEclipseを介してantスクリプトを実行することにより、コードをホットスワップできます。

仕事では、クラスファイルのタイムスタンプを比較することでコードの変更を自動的にホットスワップするスクリプトを利用しています。これは、ホットスワップのみがクラスを変更した簡単な例を示すプロジェクトページのサンプルに似ています。

追記:これはJPDAを利用します。

于 2011-01-03T15:39:28.170 に答える
3

これは、JPDA(Java Platform Debugger Architecture)インターフェースを介して実行できます。http://download.oracle.com/javase/1.4.2/docs/guide/jpda/enhancements.html#hotswap

Erlangの場合のように自動ではありません-かなり明白な理由で、JVMはクラスファイルへの変更についてクラスパスを監視せず、変更された場合はそれらをリロードして再リンクします(JavaはポーリングしたくないWeb展開用に設計されていますhttp変更のURL)。

于 2010-12-29T10:45:57.810 に答える
3

少し古い投稿ですが、誰かがこれが役立つことを願っています:

比較的新しいホットスワップエージェントは十分に文書化されており、機能が豊富です(そして何よりもオープンソースです)。

于 2015-06-21T15:56:41.923 に答える
1

OSGiはどうですか?ホットスワップは、仕様に「組み込まれている」ものです。これも1つの可能な解決策になると思います。

于 2011-01-04T08:44:43.403 に答える
1

Strategyデザインパターンを使用できるため、メソッドではなく操作するオブジェクトと、プログラムと通信して、指定されたクラス名をStrategyオブジェクトのクラスとして使用するように指示するプロトコルがあります。

于 2011-01-04T13:29:49.087 に答える