Обновите код Java во время выполнения - PullRequest
9 голосов
/ 20 июня 2010

около года назад я наткнулся на замечательную функцию в Java, которую я не могу снова найти.

Через некоторый волшебный интерфейс было возможно объявить некоторые классы или функции заменяемыми во время выполнения.
Я нашел хороший пример руководства для того, кто запускал простую небольшую программу, которая печатала определенное сообщение, затем он обновил программу, используя метод, который я больше не могу вспомнить, и вдруг программа заменила эту старую функцию печати новой.

Я пытался просматривать Java API, чтобы пробудить память, а также поиск в Google, но безуспешно. Может кто-нибудь здесь помочь?

Ответы [ 4 ]

8 голосов
/ 20 июня 2010

Различные контейнеры приложения могут сделать это.

Обычно вам нужно перезагрузить класс в новом ClassLoader (если только вы не говорите об этом в отладчике, в этом случае доступны совершенно другие API).

На мой взгляд, подобные вещи редко стоят хлопот: спроектировать все так, чтобы его можно было перезагрузить, значительно сложнее, чем спроектировать, чтобы его можно было полностью перезапустить в новом процессе. Также проще точно определить, какой код выполняется, если в процессе загружена только одна версия.

Демонстрация очень удобна, но для большинства приложений это того не стоит. Все на мой взгляд, конечно:)

Обратите внимание, что одним заметным исключением является возможность перезагрузки слоев веб-интерфейса без перезапуска контейнера: это может упростить жизнь * .

5 голосов
/ 20 июня 2010

Технология HotSwap была добавлена ​​в Java 1.4 и включает файл класса замена во время выполнения.Функция предоставляется с помощью метода redefineClasses пакета Instrumentation .Я думаю, что вы также можете сделать это через интерфейс JPDA .

Вот также ссылка на то, что, как я полагаю, является исследовательской работой, в которой сначала описывается механизм HotSwap:

В противном случае вы можете использовать Classloader , как указано выше, но он обеспечивает только динамическую загрузку класса , а не замену.Один и тот же класс, загруженный дважды, будет рассматриваться как два разных типа.В сочетании с интерфейсом и / или небольшим количеством размышлений, он, однако, может предоставить способы обновления приложения во время выполнения.

Вот ссылка на удивительный документ о загрузчике классов и его использовании:

Я не буду подробно останавливаться на том, хорошо это или плохо, потому что это был не ваш вопрос, но я думаю, что здорово иметь поддержку для эволюции программного обеспечения во время выполнения - слишком плохо, что JSR-117 никогда не делал это!

1 голос
/ 20 июня 2010

Обычно это тот тип функциональности, который я с удовольствием оставляю инфраструктуре, так как трудно понять, что легко, а что нет. Как упоминал Джон, большинству приложений это не нужно, и для тех, кому это нужно, доступна инфраструктура.

В настоящее время большинство серверов приложений допускают горячее развертывание, и в равной степени большинство серверов приложений являются встраиваемыми и позволяют удалять их для удаления ненужных вам функций.

Если это в основном для разработки, вы должны посмотреть JRebel , который предоставляет эту функцию прозрачно. Я слышал, что они работают над решением во время выполнения, но я не знаю, готово ли оно к прайм-тайму.

Если вы действительно заинтересованы в том, чтобы заставить это работать, подумайте об использовании OSGi. У него есть крутая кривая обучения, но как только вы это сделаете, он сделает все правильно и будет работать очень хорошо. Я нашел pax tools хорошей отправной точкой, но у цепочки инструментов eclipse также есть хорошая поддержка.

0 голосов
/ 13 апреля 2019

Я экспериментировал с этим и нашел некоторый успех с Eclipse, с помощью следующих шагов. Я использовал Tomcat с Spring Boot.

  1. запустить приложение в режиме отладки из меню запуска Eclipse.

  2. внести необходимые изменения кода.

  3. снова запустите то же приложение на другом порту.

  4. если я смотрю на приложение, запущенное на шаге 1, оно обновляется новым кодом.

Это помогает мне, когда я хочу пропустить длительную настройку инициализации приложения. Однако это не всегда работает: если это не так, помогает перезапуск Eclipse.

...