Java, перезагрузка класса времени выполнения - PullRequest
2 голосов
/ 16 ноября 2010

Я ищу способ перезагрузить класс в Java во время выполнения. Мотивация - сделать отладку более эффективной. Приложение представляет собой типичный клиент-серверный дизайн, который синхронно обрабатывает запросы. Объект «обработчик» создается для каждого запроса. Это единственный класс, который я намерен заменить динамически. Поскольку каждый запрос имеет дело со свежим экземпляром, перезагрузка этого класса не будет иметь побочных эффектов. Короче говоря, я не хочу перезапускать все приложение каждый раз, когда происходит изменение этого модуля.

В моем проекте процессу Java становится известно, что файл .class обновлялся в пути к классам между запросами. Когда это происходит, класс «обработчик» выгружается и загружается новый.

Я знаю, что могу использовать интерфейс classLoader для загрузки в новый класс. Кажется, у меня возникают проблемы с поиском правильного способа «разгрузки».

Ответы [ 3 ]

4 голосов
/ 16 ноября 2010

Классы будут выгружаться и собирать мусор, как и любой другой объект, если на них нет оставшейся ссылки. Это означает, что не должно быть достижимого экземпляра класса (загруженного этим конкретным экземпляром загрузчика классов), и сам экземпляр загрузчика классов также должен иметь право на сборку мусора.

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

1 голос
/ 16 ноября 2010

Я считаю, что на самом деле вам нужна иерархия загрузчиков классов, и для перезагрузки вы фактически избавляетесь от загрузчика классов низкого уровня (средствами normall GC) и, следовательно, от всех загруженных им классов.Насколько мне известно, этот метод используется серверами приложений Java EE для перезагрузки приложений, и есть немало забавных результатов, когда код платформы, загруженный в один загрузчик классов, хочет использовать классы, загруженные в другое место.

0 голосов
/ 14 июля 2015

По состоянию на 2015 год также отсутствует возможность перезагрузки классов в java.

  • Используйте OSGi , чтобы создать приложение для перезагрузки класса.
  • Используйте jrebel для тестирования. Есть несколько других, которые делают то же самое.
  • Используйте сервер приложений и выведите части, которые вы хотите перезагрузить, в отдельное веб-приложение. Затем продолжайте развертывание / развертывание. В конечном итоге вы получите некоторые ошибки типа переполнения пространства perm gen из-за висячих старых экземпляров ClassLoader.
  • Используйте программу запуска сценариев для выполнения частей изменяемого кода. JSR-223 Поддержка API сценариев Java для языка сценариев "Java".

Я написал серию о перезагрузке классов. Но все эти методы не годятся для производства.

ИМХО, перезагрузка этого класса грязна в Java и не стоит его пробовать. Но я бы очень хотел, чтобы это было спецификацией в Java.

...