Динамическая перезагрузка класса работает только в режиме отладки, почему/как это работает на самом деле?

У меня каверзный вопрос.

Моя java-программа делает в цикле такие вещи:

петля:

  1. прочитать внешний файл с скомпилированным классом java в массив byte[].

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

  3. установить байты из прочитанного файла в этот экземпляр загрузчика классов.

  4. используя созданный загрузчик классов, создайте новый экземпляр объекта класса из внешнего файла.

  5. вызвать любой метод созданного объекта.

И где проблема.

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

  2. Но когда я запускаю эту программу НЕ в режиме отладки, она всегда выполняет старую версию, несмотря на то, что прочитанный файл изменился.

Может быть, кто-то с более глубоким знанием проблем загрузки классов и поведения JVM может объяснить мне это поведение.


person Łukasz Rzeszotarski    schedule 14.05.2012    source источник
comment
какую информацию вы получаете от флага -verbose:class, переданного java?   -  person Greg Kopff    schedule 14.05.2012


Ответы (2)


Вот упрощенная версия того, что происходит:

  1. JVM загружает классы и другие ресурсы в путь к классам ровно один раз (если не работает в режиме отладки) из каталогов или JAR-файлов, указанных в переменной среды CLASSPATH.
  2. Для этого он использует ClassLoaders
  3. После загрузки ресурса экземпляром ClassLoader он остается в памяти до тех пор, пока ClassLoader не будет удален сборщиком мусора.

Режим отладки — это специальный режим, предоставляемый JVM, и загрузчик классов усердно работает, чтобы предоставить вам последнюю версию ресурса.

person Rajesh J Advani    schedule 14.05.2012