61 votes

Modifier une méthode au moment de l'exécution via un mécanisme d'échange à chaud

Supposons que nous avons un banal programme Java qui se compose d'une seule classe:

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);
   }
}

Après avoir compilé et exécuté, la sortie sera ceci:

Aujourd'hui est un beau jour avec un nombre de 0

Aujourd'hui est un beau jour avec un nombre de 1

Aujourd'hui est une belle journée avec un numéro 2

Aujourd'hui est un beau jour avec un nombre de 3

...

Ma question: existe-t-il (ou est-il à l'horizon) d'une certaine façon pour échanger replacable méthode au moment de l'exécution? Quelque chose comme écrire une autre version de l' HelloWorld avec une nouvelle version d' replacable, le compiler et l'ancienne version dans une déjà en cours d'exécution de la JVM?

Donc, si j'écris la nouvelle version comme ceci:

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

est-il quelque chose de similaire à Erlang hot code swapping où je peux faire ceci:

  1. exécutez le programme d'origine
  2. écrire une version modifiée
  3. à l'aide d'un programme en ligne de commande, connectez-vous à l'exécution de la JVM et à remplacer la méthode

de sorte que, lors de l'exécution, ce qui va se passer:

Aujourd'hui est un beau jour avec un nombre de 15000

Aujourd'hui est une belle journée avec un certain nombre 15001

Aujourd'hui est un encore plus beau jour avec un nombre 15002

Aujourd'hui est un encore plus beau jour avec un nombre 15003

...

Supposons que le programme ci-dessus est autonome, fonctionne en standard environnement Java SE, il n'y a rien d'autre sur le chemin de classe, donc c'est presque un Hello world style de programme.

Note: je sais que des technologies comme la manipulation de bytecode (cglib), aspectJ, jRebel, JMX, hotswapping des méthodes en Java EE etc. existent, mais ils ne sont pas ce que je suis en train de penser. Pensez à Erlang.

41voto

Arun Points 591

vous pouvez utiliser HotSwap JVM de l'outil ou de jrebel outil pour atteindre votre objectif plus facilement. HotSwap est outil opensource mais jrebel est commercial , HotSwap est encore en développement, donc vous pouvez l'utiliser pour des fins de développement uniquement

Caractéristiques

  1. Méthode D'Échange De Corps
  2. Ajouter Une Méthode
  3. Supprimer La Méthode
  4. Ajouter Un Champ
  5. Supprimer Le Champ
  6. Ajouter Supertype
  7. Supprimer Supertype

15voto

M. Jessup Points 4588

Vous pouvez le faire via des chargeurs de classes. Par exemple, si vous connaissez les conteneurs Servlet tels que tomcat qui rechargent les pages au fur et à mesure que vous les modifiez en développement. Voici une excellente explication de la création de code dynamique en Java . Cela explique non seulement le chargement mais aussi la compilation de la source à la volée. Vous devriez pouvoir appliquer les concepts abordés à toute stratégie de rechargement de code que vous souhaitez utiliser.

9voto

Andy Points 1984

J'ai utilisé ce hotswap tâche ant dans de nombreux projets. La cible de l'application java peut être lancé via Ant, Eclipse, une invite de commande, ou par tout autre moyen, tant qu'il est lancé en mode debug avec le port approprié de l'ouvrir. La page fournit des instructions sur la façon de le faire via Ant.

N'importe quel nombre de classes peut être hotswapped tant que les modifications ne sont pas structurelles. Corps de la méthode modifications sont généralement hotswap avec facilité. Le Code peut être hotswapped par l'exécution d'un script ant via un shell ou Eclipse.

Au travail, j'utilise un script qui hotswaps modifications de code automatiquement en comparant les horodatages sur les fichiers de classe. Ceci est similaire à l'exemple sur la page du projet qui montre un exemple simple que seulement hotswaps changé de classe.

Note supplémentaire: Il utilise la JPDA.

4voto

Pete Kirkham Points 32484

Vous pouvez le faire par le biais de la JPDA (Plate-forme Java Débogueur de l'Architecture de l'interface: http://download.oracle.com/javase/1.4.2/docs/guide/jpda/enhancements.html#hotswap

Ce n'est pas automatique comme l'Erlang cas - la JVM ne surveille pas le chemin de classe pour des modifications à la catégorie fichiers puis de les recharger et de les lier à nouveau en cas de changement, pour des raisons assez évidentes (Java a été conçu pour un déploiement sur le web vous ne voulez pas être d'interrogation d'une URL http pour les changements).

1voto

javamonkey79 Points 6807

Qu'en est-il d'OSGi? L'échange à chaud est en quelque sorte "intégré" à la spécification - je penserais que ce serait aussi une solution possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X