Предположит, что мы имеем тривиальную программу 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's hot code swapping, где я могу это сделать:
- запустить оригинальную программу
- записи модифицированная версия
- с использованием программы командной строки, подключиться к работающей JVM и заменить существующий метод
так, что во время выполнения, это будет происходить:
Сегодня хороший день с номером 15000
Сегодня хороший день с номером 15001
Сегодня это даже лучше день с номером 15002
Сегодня это еще лучше день с номером 15003
...
Предположим, что вышеуказанная программа является автономной, работает в стандартной среде Java SE, в пути к классам больше нет ничего, поэтому это почти программа стиля Hello Hello.
Примечание: Я знаю, что такие технологии, как манипуляции байткода (cglib) aspectJ, jRebel, JMX, hotswapping методов в Java EE и т.д. существуют, но они не то, что я имею в виду. Подумайте об Эрланге.
Можете ли вы объяснить, почему вы не можете использовать шаблон стратегии (например, объект переменной, реализующий требуемую переменную)? Способы обмена звучат сложнее, чтобы достичь того, чего вы хотите. – ivy
@ivy: Я мог бы использовать это, конечно, но мне просто интересно, можно ли делать то, что я описал в своем вопросе. Вы можете рассматривать это как «теоретический» вопрос каким-то образом. – darioo
@ivy существует механизм для обновления текущей службы, а не для выбора между набором известных реализаций. –