Почему фаза разрешения требуется в Java во время загрузки класса? - PullRequest
0 голосов
/ 29 декабря 2018

Когда символические ссылки заменяются ссылками на память в области метода?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

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

Когда заменяются символьные ссылкисо ссылками на память в области метода

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

Проверка файла класса происходит в четыре этапа:

  • Пропуск 1 : структурные проверки файлов класса

    Это происходит каккласс загружен.Загруженный класс проверяется на наличие внутренней структуры, чтобы гарантировать его безопасность.

  • Paas 2 : семантические проверки на тип данных.

    Здесь верификатор файла класса обеспечивает соблюдение семантики языка программирования Java.

  • Pass 3 : проверка байт-кода

    Здесь поток данныхвыполняется анализ байт-кодов, представляющих методы класса

  • Pass 4 : проверка символьных ссылок

    Именно этот проход4, где происходит динамическое связывание, которое является ничем иным, как процессом преобразования символьных ссылок в прямые ссылки.

0 голосов
/ 29 декабря 2018

Все символические ссылки, которые теперь были загружены в область метода в форме пула констант времени выполнения, преобразуются в фактические типы, загруженные этой JVM.Если символьная ссылка может быть разрешена, но приводит к конфликту определений, выдается IncompatibleClassChangeError.Если ссылочный класс не может быть найден, выдается NoClassDefFoundError, который в основном оборачивает ClassNotFoundException, который был сгенерирован загрузчиком классов, пытающимся загрузить этот ссылочный класс.Если ссылочный класс ссылается на себя, выдается ClassCircularityError.Разрешение может происходить в одном из двух вариантов, который зависит от разработчиков JVM

Eager : все символические ссылки на другие поля, методы или классы разрешаются прямо сейчас.

Ленивый : Разрешение символьных ссылок откладывается до первого использования метода.Это может привести к тому, что класс, ссылающийся на несуществующий класс, никогда не выдаст ошибку, если эту ссылку не нужно разрешать.

Посмотрите на начало Глава 5.4.3. Резолюция, там указано явно:

Виртуальная машина Java инструктирует anewarray, checkcast, getfield, getstatic, instanceof, invokedynamic, invokeinterface, invokespecial, invokestatic, invokevirtual, ldc, ldc_w, multianewarray, new, putfieldи puttatic делают символические ссылки на пул констант во время выполнения.Выполнение любой из этих инструкций требует разрешения ее символьной ссылки.

Существует разрешение прямого суперкласса и непосредственно реализованных интерфейсов (или суперинтерфейсов в случае интерфейса), которое происходит рано, и естьразрешение символьных ссылок для приведенных выше инструкций байтового кода, которые могут быть отложены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...