Предположим, что у нас есть тривиальная программа 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
Сегодня хороший день с номером 1
Сегодня хороший день с номером 2
Сегодня хороший день с номером 3
...
Мой вопрос: существует ли (или есть на горизонте) способ обменять метод replacable
во время выполнения? Что-то вроде написания другой версии HelloWorld
с новой версией replacable
, ее компиляции, а затем старой версии в уже запущенной JVM?
Итак, если я напишу новую версию следующим образом:
private static void replacable(int i) {
System.out.println("Today is an even nicer day with a number " + i);
}
есть что-то похожее на замену горячего кода Erlang, где я могу это сделать:
- запустить оригинальную программу
- написать измененную версию
- с помощью командной строки, подключитесь к запущенной JVM и замените существующий метод
так что во время выполнения это произойдет:
Сегодня хороший день с номером 15000
Сегодня хороший день с номером 15001
Сегодня еще приятней день с номером 15002
Сегодня еще более приятный день с номером 15003
...
Предположим, что вышеуказанная программа является автономной, работает в стандартной среде Java SE, в classpath нет ничего другого, так что это почти программа стиля Hello Hello.
Примечание. Я знаю, что такие технологии, как манипуляция с байт-кодом (cglib), aspectJ, jRebel, JMX, существует горячая замена методов в Java EE и т.д., но это не то, что Я думал о. Подумайте об Эрланге.