Java обновления кодирует во время времени выполнения

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

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

Я попытался просмотреть Java API, чтобы зажечь мою память, а также гуглить, но без успеха. Кто-либо может здесь помочь?

9
задан Glader 20 June 2010 в 14:20
поделиться

3 ответа

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

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

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

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

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

8
ответ дан 4 December 2019 в 14:26
поделиться

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

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

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

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

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

5
ответ дан 4 December 2019 в 14:26
поделиться

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

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

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

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

1
ответ дан 4 December 2019 в 14:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: