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:
- exécutez le programme d'origine
- écrire une version modifiée
- à 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.