Стадии загрузки классов.

Загрузка классов - это процесс, в ходе которого новый тип данных вводится в процесс, выполняющийся в виртуальной машине JVM. Процесс загрузки классов выполняется в несколько стадий.

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

За преобразование файла класса, представленного в виде массива байтов, в объект класса отвечает метод Classloader::defineClass(). Этот метод защищён и недоступен без дополнительной подклассификации.

Первым делом метод defineClass() выполняет загрузку. С этой целью создаётся скелетное представление объекта класса, соответствующего загружаемому классу. На этой стадии производится ряд основных проверок в классе(например, непротиворечивость констант, присутствующих в наборе констант).

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

  • Верификация.
  • Подготовка и разрешение.
  • Инициализация.

На стадии верификации подтверждается, соответствует ли файл класса определённым ожиданиям и не предпринимается ли в нём попытка нарушить модель защиты в виртуальной машине JVM.

Как только класс успешно пройдёт верификацию, он будет готов к продолжению процесса загрузки. Выделяемые ячейки оперативной памяти и статические переменные в классе подготавливаются далее к инициализации. На данной стадии переменные не инициализируются, а байт-код из вновь загруженного класса не выполняется. Прежде чем выполнить какой-нибудь код, виртуальная машина JVM проверяет, будет ли на стадии выполнения известно о каждом типе данных, на который делается ссылка в файле нового класса.Если какие-то типы данных неизвестны, их, возможно, придётся загрузить дополнительно. И в таком случае может быть снова запущен процесс загрузки классов с целью загрузить новые типы данных в виртуальную машину JVM. Этот процесс загрузки и выявления типов данных может выполняться неоднократно до тех пор, пока не будет получено устойчивое множество типов данных. Это так называемое транзитивное замыкание загруженного первоначального типа данных.

 Как только загруженный класс будет разрешён в виртуальной машине JVM, его можно инициализировать. На данной стадии могут быть инициализированы статические переменные и выполнены блоки инициализации. Именно на этой стадии в виртуальной машине JVM впервые выполняется байт-код из вновь загруженного класса. И как только завершится выполнение всех статических блоков кода, класс будет полностью загружен и готов к применению.