приблизительно год назад я споткнулся через хорошую функцию в Java, который я не могу ни за что в жизни найти снова.
Через некоторый волшебный интерфейс было по-видимому возможно объявить некоторые классы или функции, заменимые во время времени выполнения.
Я нашел хорошее руководство в качестве примера кого-то, кто запустил простую небольшую программу, которая распечатала определенное сообщение, он затем обновил программу с помощью метода, который я не могу помнить больше, и внезапно программа заменила ту старую функцию печати новой.
Я попытался просмотреть Java API, чтобы зажечь мою память, а также гуглить, но без успеха. Кто-либо может здесь помочь?
Это могут сделать различные контейнеры приложений.
В основном вам нужно будет перезагрузить класс в новый ClassLoader
(если только вы не говорите о том, чтобы сделать это под отладчиком, в этом случае доступны совершенно другие API).
На мой взгляд, такие вещи редко стоят хлопот: спроектировать все так, чтобы его можно было перезагрузить, значительно сложнее, чем спроектировать так, чтобы его можно было полностью перезапустить в новом процессе. Кроме того, легче быть уверенным в том, какой именно код выполняется, если в процесс загружается только одна версия.
Это изящная вещь для демонстрации, но для большинства приложений она того не стоит. Все это, конечно, мое мнение :)
Обратите внимание, что одним из заметных исключений является возможность перезагрузки слоев веб-интерфейса без перезапуска контейнера: это может сделать жизнь намного проще.
Технология HotSwap была добавлена в Java 1.4 и позволяет заменять файл класса во время выполнения. Эта функция предоставляется с помощью метода redefineClasses
пакета инструментов . Я думаю, вы также можете сделать это через интерфейс JPDA .
Здесь также есть ссылка на то, что я считаю исследовательской статьей, в которой сначала описывается механизм HotSwap:
В противном случае вы можете использовать Classloader , но он обеспечивает только загрузку динамического класса , но не замену. Один и тот же класс, загруженный дважды, будет считаться двумя разными типами. Однако в сочетании с интерфейсом и / или отражением он может предоставить способы обновления приложения во время выполнения.
Вот ссылка на замечательный документ о загрузчике классов и его использовании:
Я не буду подробно останавливаться на том, хорошо это или плохо, потому что это не так. на ваш вопрос, но я думаю, что здорово иметь поддержку эволюции программного обеспечения во время выполнения - очень плохо, что JSR-117 так и не удалось!
Обычно это тот вид функциональности, который я с радостью оставляю инфраструктуре, поскольку сложно сделать правильный выбор и легко ошибиться. Как упоминал Джон выше, большинству приложений он не нужен, а для тех, кому это нужно, доступна инфраструктура.
Большинство серверов приложений в настоящее время допускают «горячее» развертывание, и в равной степени большинство серверов приложений являются встраиваемыми и позволяют урезать их, чтобы удалить ненужные функции.
Если это в основном для разработки, вам следует посмотреть JRebel , который прозрачно предоставляет эту функциональность. Я слышал, что они работают над решением для среды выполнения, но я не знаю, готово ли оно к использованию в прайм-тайм.
Если вы действительно заинтересованы в том, чтобы это работало, подумайте об использовании OSGi. У него крутая кривая обучения, но как только вы его осознаете, он делает большинство вещей правильно и работает очень хорошо. Я нашел pax tools хорошей отправной точкой, но набор инструментов eclipse также имеет хорошую поддержку для этого.