Andres_D прав, мы можем очень хорошо сделать это, используя пользовательскую загрузку классов, вот подробное руководство о том, как это сделать: http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html?page=1
В статье объясняется, как писать динамический код Java. В нем рассматриваются компиляция исходного кода во время выполнения, перезагрузка класса и использование шаблона проектирования Proxy для внесения изменений в динамический класс, прозрачный для его вызывающей стороны.
Фактически, исследователь в Австрии написал JVM, которая даже позволяет перезагружать классы с различными иерархиями типов. Они достигли этого, используя существующие точки сохранения потока для генерации полного «побочного юниверса» объекта и всех связанных с ним ссылок и ссылочного содержимого, а затем после полной перестановки со всеми необходимыми изменениями просто поменяйте местами во всех измененных классах. [1] Здесь ссылка на их проект http://ssw.jku.at/dcevm/, спонсорство оракула, безусловно, дает интересные размышления о планах на будущее.
Менее навязчивые изменения в теле методов и полях уже возможны в стандартной Java-ВМ с использованием возможностей горячей замены JPDA, представленных в Java 1.4:
docs.oracle.com/javase/1.4.2/docs/guide/jpda/enhancements.html#hotswap
Я не уверен, был ли он первым, но статья этого сотрудника Sun от 2001 года, похоже, является одним из ранних предложений, в которых упоминаются возможности HotSpot для Hot Swap. [2]
ССЫЛКА
[1] Т. Вюртингер, К. Виммер и Л. Стадлер, «Динамическая эволюция кода для Java», представленная на 8-й Международной конференции по принципам и практике программирования на Java, Вена, 2010.
[2] М. Дмитриев, «На пути к гибкой и безопасной технологии для эволюции приложений на языке Java во время выполнения», на семинаре OOPSLA по проектированию сложных объектно-ориентированных систем для эволюции, 2001 г.