Spec-Zone .ru
спецификации, руководства, описания, API
Содержание | Предыдущий | Следующий | ИндексСпецификация Виртуальной машины JavaTM


ГЛАВА 5

Загрузка, Соединение, и Инициализация


Виртуальная машина Java динамически загружается (§2.17.2), ссылки (§2.17.3), и инициализирует (§2.17.4) классы и интерфейсы. Загрузка является процессом обнаружения двоичного представления класса или интерфейсного типа с определенным именем и созданием класса или интерфейса от того двоичного представления. Соединение является процессом взятия класса или интерфейса и объединения этого в состояние времени выполнения виртуальной машины Java так, чтобы это могло быть выполнено. Инициализация класса или интерфейса состоит из выполнения класса или интерфейсного метода инициализации <clinit> (§3.9).

В этой главе Раздел 5.1 описывает, как виртуальная машина Java получает символьные ссылки из двоичного представления класса или интерфейса. Раздел 5.2 объясняет, как процессы загрузки, соединения, и инициализации сначала инициируются виртуальной машиной Java. Раздел 5.3 определяет, как двоичные представления классов и интерфейсов загружаются загрузчиками класса и как создаются классы и интерфейсы. Соединение описывается в Разделе 5.4. Разделите 5.5 деталей, как инициализируются классы и интерфейсы. Наконец, Раздел 5.6 представляет понятие привязки собственных методов.


5.1 Пул Константы этапа выполнения

Виртуальная машина Java поддерживает постоянный пул на тип (§3.5.5), структура данных времени выполнения, которая служит многим из целей таблицы символов стандартной реализации языка программирования.

constant_pool таблица (§4.4) в двоичном представлении класса или интерфейса используется, чтобы создать пул константы этапа выполнения на класс или интерфейсное создание (§5.3). Все ссылки в пуле константы этапа выполнения являются первоначально символьными. Символьные ссылки в пуле константы этапа выполнения получаются из структур в двоичном представлении класса или интерфейса следующим образом:

Кроме того, определенные нессылочные ставки времени выполнения делаются на элементы, найденные в constant_pool таблица:

Остающиеся структуры в constant_pool таблица двоичного представления класса или интерфейса, CONSTANT_NameAndType_info (§4.4.6) и CONSTANT_Utf8_info (§4.4.7) структуры только используются косвенно, получая символьные ссылки на классы, интерфейсы, методы, и поля, и получая строковые литералы.


5.2 Запуск Виртуальной машины

Виртуальная машина Java запускает, создавая начальный класс, который определяется зависящим от реализации способом, используя загрузчик класса начальной загрузки (§5.3.1). Виртуальная машина Java тогда соединяет начальный класс, инициализирует его, и вызывает public метод класса void main(String[]). Вызов этого метода управляет всем дальнейшим выполнением. Выполнение инструкций виртуальной машины Java, составляющих main метод может вызвать соединение (и следовательно создание) дополнительных классов и интерфейсов, так же как вызова дополнительных методов.

В некоторых реализациях виртуальной машины Java начальный класс мог быть обеспечен как параметр командной строки, как в выпусках 1.0 и 1.1 JDK. Альтернативно, начальный класс мог быть обеспечен реализацией. В этом случае начальный класс мог бы установить загрузчик класса, который поочередно загрузит приложение, как в Java 2 SDK, Standard Edition, v1.2. Другие варианты начального класса возможны, пока они являются непротиворечивыми со спецификацией, данной в предыдущем абзаце.


5.3 Создание и Загрузка

Создание класса или интерфейса C обозначенный именем N состоит из конструкции в области метода виртуальной машины Java (§3.5.4) специфичного для реализации внутреннего представления К. Класса, или интерфейсное создание инициировано другим классом или интерфейсом D, который объединяют в пул ссылки C через его константу этапа выполнения. Класс или интерфейсное создание могут также быть инициированы D вызов методов в определенных Библиотеках классов Java (§3.12), таких как отражение.

Если C не является классом массива, он создается, загружая двоичное представление C (см. Главу 4, "Формат файла класса"), использование загрузчика класса (§2.17.2). У классов массива нет внешнего двоичного представления; они создаются виртуальной машиной Java, а не загрузчиком класса.

Есть два типа загрузчиков класса: определяемые пользователем загрузчики класса и загрузчик класса начальной загрузки предоставляются виртуальной машиной Java. Каждый определяемый пользователем загрузчик класса является экземпляром подкласса абстрактного класса ClassLoader. Приложения используют загрузчики класса, чтобы расширить способ, которым виртуальная машина Java динамически загружает и таким образом создает классы. Определяемые пользователем загрузчики класса могут использоваться, чтобы создать классы, которые происходят из определяемых пользователем источников. Например, класс мог быть загружен через сеть, генерировал на лету, или извлек из зашифрованного файла.

Загрузчик класса L может создать C, определяя это непосредственно или делегируя к другому загрузчику класса. Если L создает C непосредственно, мы говорим, что L определяет C или, эквивалентно, что L является загрузчиком определения C.

Когда один загрузчик класса делегирует к другому загрузчику класса, загрузчик, который инициирует загрузку, является не обязательно тем же самым загрузчиком, который завершает загрузку и определяет класс. Если L создает C, или определяя это непосредственно или делегацией, мы говорим, что загрузка новичков L C или, эквивалентно, что L является загрузчиком инициирования C.

Во время выполнения, класс или интерфейс определяется не одним только его именем, а парой: его полностью определенное имя и его загрузчик класса определения. Каждый такой класс или интерфейс принадлежат единственному пакету времени выполнения. Пакет времени выполнения класса или интерфейса определяется именем пакета и загрузчиком класса определения класса или интерфейса.

Виртуальная машина Java использует одну из трех процедур, чтобы создать класс или соединить интерфейсом с C, обозначенным N:

Мы будем иногда представлять класс или интерфейс, используя нотацию <N, Ld>, где N обозначает имя класса или интерфейса, и Ld обозначает загрузчик определения класса или интерфейса. Мы также представим класс или интерфейс, используя нотацию NLi, где N обозначает имя класса или интерфейса, и Литий обозначает загрузчик инициирования класса или интерфейса.

5.3.1 Загрузка Используя Загрузчик Класса Начальной загрузки

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

Во-первых, виртуальная машина Java определяет, был ли загрузчик класса начальной загрузки уже записан как загрузчик инициирования класса или интерфейса, обозначенного N. Если так, этот класс или интерфейс являются C, и никакое создание класса не необходимо.

Иначе, виртуальная машина Java выполняет одну из следующих двух операций, чтобы загрузить C:

  1. Виртуальная машина Java ищет подразумеваемое представление C зависимым от платформы способом. Отметьте, что нет никакой гарантии, что подразумеваемое найденное представление допустимо или является представлением C.

    Как правило, класс или интерфейс будут представлены, используя файл в иерархической файловой системе. Имя класса или интерфейса будет обычно кодироваться в пути файла.

    Эта фаза загрузки должна обнаружить следующую ошибку:

    Затем виртуальная машина Java пытается получить класс, обозначенный N использование загрузчика класса начальной загрузки от подразумеваемого представления, используя алгоритм, найденный в Разделе 5.3.5. Тот класс является C.

  2. Загрузчик класса начальной загрузки может делегировать загрузку C к некоторому определяемому пользователем загрузчику класса L, передавая N к вызову a loadClass метод на L. Результатом вызова является C. Виртуальная машина Java тогда записывает это, программа начальной загрузки является загрузчиком инициирования C (§5.3.4).

5.3.2 Загрузка Используя Определяемый пользователем Загрузчик Класса

Следующие шаги используются, чтобы загрузить и таким образом создать класс немассива или соединить интерфейсом с C, обозначенным N использование определяемого пользователем загрузчика класса L.

Во-первых, виртуальная машина Java определяет, был ли L уже записан как загрузчик инициирования класса или интерфейса, обозначенного N. Если так, этот класс или интерфейс являются C, и никакое создание класса не необходимо.

Иначе виртуальная машина Java вызывает loadClass(N ) на L.1 значение, возвращенное вызовом, является создаваемым классом или интерфейсом C. Виртуальная машина Java тогда записывает это, L является загрузчиком инициирования C (§5.3.4). Остаток от этого раздела описывает этот процесс более подробно.

Когда loadClass метод загрузчика класса L вызывается с именем N класса, или интерфейс C, чтобы быть загруженным, L должен выполнить одну из следующих двух операций, чтобы загрузить C:

  1. Загрузчик класса L может создать массив байтов, представляющих C как байты a ClassFile структура (§4.1); это тогда должно вызвать метод defineClass из класса ClassLoader. Вызов defineClass заставляет виртуальную машину Java получать класс или интерфейс, обозначенный N, использующим L от массива байтов, используя алгоритм, найденный в Разделе 5.3.5.

  2. Загрузчик класса L может делегировать загрузку C к некоторому другому загрузчику класса L'. Это выполняется, передавая параметр N прямо или косвенно к вызову метода на L' (обычно loadClass метод). Результатом вызова является C.

5.3.3 Создание Классов Массива

Следующие шаги используются, чтобы создать класс C массива, обозначенный N использование загрузчика класса, загрузчик Л. Класса L может быть или загрузчиком класса начальной загрузки или определяемым пользователем загрузчиком класса.

Если L был уже записан как загрузчик инициирования класса массива с тем же самым компонентным типом как N, тот класс является C, и никакое создание класса массива не необходимо. Иначе, следующие шаги выполняются, чтобы создать C:

  1. Если компонентный тип является ссылочным типом, алгоритм этого раздела (§5.3) применяется, рекурсивно используя загрузчик класса L, чтобы загрузить и таким образом создать компонентный тип C.

  2. Виртуальная машина Java создает новый класс массива с обозначенным компонентным типом и числом размерностей. Если компонентный тип является ссылочным типом, C отмечается как определенный загрузчиком класса определения компонентного типа. Иначе, C отмечается как определенный загрузчиком класса начальной загрузки. В любом случае виртуальная машина Java тогда записывает это, L является загрузчиком инициирования для C (§5.3.4). Если компонентный тип является ссылочным типом, доступность класса массива определяется доступностью его компонентного типа. Иначе, доступность класса массива public.

5.3.4 Загрузка Ограничений

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

Когда класс или интерфейс C = <N1, L1> делает символьную ссылку на поле или метод другого класса или интерфейса D = <N2, L2>, символьная ссылка включает дескриптор, определяющий тип поля, или возврат и типы параметра метода. Важно, что любое имя типа N упомянутый в поле или дескрипторе метода обозначает тот же самый класс или интерфейс когда загружено L1 и когда загружено L2.

Чтобы гарантировать это, виртуальная машина Java налагает загружающиеся ограничения формы NL1 = NL2 во время подготовки (§5.4.2) и разрешение (§5.4.3). Чтобы осуществить эти ограничения, виртуальная машина Java будет в определенные предписанные времена (см. §5.3.1, §5.3.2, §5.3.3, и §5.3.5), запись, что определенный загрузчик является загрузчиком инициирования определенного класса. После записи, что загрузчик является загрузчиком инициирования класса, виртуальная машина Java должна сразу проверить, чтобы видеть, нарушаются ли какие-либо ограничения загрузки. Если так, от записи отрекаются, виртуальная машина Java бросает a LinkageError, и загружающаяся работа, которая заставила запись иметь место сбои.

Точно так же после наложения загружающегося ограничения (см. §5.4.2, §5.4.3.2, §5.4.3.3, и §5.4.3.4), виртуальная машина Java должна сразу проверить, чтобы видеть, нарушаются ли какие-либо ограничения загрузки. Если так, от недавно наложенного ограничения загрузки отрекаются, виртуальная машина Java бросает a LinkageError, и работа, которая заставила ограничение быть наложенным (или разрешение или подготовка, в зависимости от обстоятельств) сбои.

Ситуации, описанные здесь, являются единственными временами, в которые виртуальная машина Java проверяет, были ли какие-либо ограничения загрузки нарушены. Загружающееся ограничение нарушается, если, и только если, все следующие четыре условия содержат:

Полное обсуждение загрузчиков класса и безопасности типов выходит за рамки этой спецификации. Для более всестороннего обсуждения читатели относятся в Динамический Класс, Загружающийся в виртуальной машине Java Шенгом Лиэнгом и Джилэдом Брэчей (Продолжения 1998 ACM SIGPLAN Конференция по Системам Объектно-ориентированного программирования, Языкам и Приложениям).

5.3.5 Получение Класса от a class Представление файла

Следующие шаги используются, чтобы получить класс немассива или соединить интерфейсом с C, обозначенным N использование загрузчика L от подразумеваемого представления в class формат файла.

  1. Во-первых, виртуальная машина Java определяет, записала ли она уже это, L является загрузчиком инициирования класса или интерфейса, обозначенного N. Если так, эта попытка создания является недопустимыми и загружающимися бросками a LinkageError.

  2. Иначе, виртуальная машина Java пытается проанализировать подразумеваемое представление. Однако, подразумеваемое представление, возможно, фактически не допустимое представление C.

    Эта фаза загрузки должна обнаружить следующие ошибки:

  3. Если у C есть прямой суперкласс, символьная ссылка от C до ее прямого суперкласса разрешается, используя алгоритм Раздела 5.4.3.1. Отметьте, что, если C является интерфейсом, он должен иметь Object как его прямой суперкласс, который, должно быть, уже был загружен. Только Object не имеет никакого прямого суперкласса.

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

  4. Если у C есть какие-либо прямые суперинтерфейсы, символьные ссылки от C до его прямых суперинтерфейсов разрешаются, используя алгоритм Раздела 5.4.3.1.

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

  5. Виртуальная машина Java отмечает C как имеющий L как его загрузчик класса определения и записи, что L является загрузчиком инициирования C (§5.3.4).

5.4 Соединение

Соединение класса или интерфейса (§2.17.3) включает проверку и подготовку того класса или интерфейса, его прямого суперкласса, его прямых суперинтерфейсов, и его типа элемента (если это - тип массива), в случае необходимости. Разрешение символьных ссылок в классе или интерфейсе является дополнительной частью соединения.

5.4.1 Проверка

Представление класса или интерфейса проверяется (§4.9), чтобы гарантировать, что его двоичное представление структурно допустимо (передает 2 и 3 из §4.9.1). Проверка может заставить дополнительные классы и интерфейсы быть загруженными (§5.3), но не должна заставить их быть подготовленными или проверенными.

Проверка должна обнаружить следующую ошибку:

Класс или интерфейс должны быть успешно проверены прежде, чем это будет инициализировано. Любой попытке инициализировать класс или интерфейс, который не был успешно проверен, должна предшествовать проверка. Повторная проверка класса или интерфейса, что виртуальная машина Java ранее неудачно попыталась проверить всегда сбои с той же самой ошибкой, которая была брошена в результате начальной попытки проверки.

5.4.2 Подготовка

Подготовка включает создание статических полей для класса или интерфейса и инициализации тех полей к их стандартным значениям по умолчанию (§2.5.1). Подготовка не должна быть перепутана с выполнением статических инициализаторов (§2.11); в отличие от выполнения статических инициализаторов, подготовка не требует выполнения любого кода виртуальной машины Java.

Во время подготовки класса или интерфейса C, виртуальная машина Java также налагает загружающиеся ограничения (§5.3.4). Позвольте L1 быть загрузчиком определения C. Для каждого метода м. объявил в C, который переопределяет метод, объявленный в суперклассе или суперинтерфейсе, виртуальная машина Java налагает следующие ограничения загрузки: Позвольте T0 быть именем типа, возвращенного м., и позволять T1..., Tn быть именами типов параметра м. Затем TiL1=TiL2 поскольку я = 0 к n (§5.3.4).

Подготовка может произойти в любое время после создания, но должна быть завершена до инициализации.

5.4.3 Разрешение

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

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

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

Определенные инструкции виртуальной машины Java требуют определенных проверок соединения, разрешая символьные ссылки. Например, для getfield инструкции, чтобы успешно разрешить символьную ссылку на поле, на котором это работает, это должно завершить полевые шаги разрешения, данные в Разделе 5.4.3.2. Кроме того, это должно также проверить, что поле не static. Если это - a static поле, соединяющееся исключение должно быть выдано.

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

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

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

5.4.3.1 Класс и Интерфейсное Разрешение

Чтобы разрешить неразрешенную символьную ссылку от D до класса или соединить интерфейсом с C, обозначенным N, следующие шаги выполняются:

  1. Загрузчик класса определения D используется, чтобы создать класс или интерфейс, обозначенный N. Этот класс или интерфейс являются C. Любое исключение, которое может быть брошено в результате отказа класса или интерфейсного создания, может таким образом быть выдано в результате отказа класса и интерфейсного разрешения. Детали процесса даются в Разделе 5.3.

  2. Если C является классом массива, и его тип элемента является ссылочным типом, то символьная ссылка на класс или интерфейс, представляющий тип элемента, разрешается, вызывая алгоритм в Разделе 5.4.3.1 рекурсивно.

  3. Наконец, права доступа к C проверяются:

    Это условие может произойти, например, если C является классом, который, как первоначально объявляли, был public но был изменен, чтобы быть не -public после того, как D был скомпилирован.

Если шаги 1 и 2 успешно выполняются, но сбои шага 3, C все еще допустим и применим. Однако, сбоям разрешения, и D мешают получить доступ к C.

5.4.3.2 Полевое Разрешение

Чтобы разрешить неразрешенную символьную ссылку от D до поля в классе или соединить интерфейсом с C, символьная ссылка на C, данный полевой ссылкой, должна сначала быть разрешена (§5.4.3.1). Поэтому, любое исключение, которое может быть брошено в результате отказа разрешения класса или интерфейсной ссылки, может быть выдано в результате отказа полевого разрешения. Если ссылка на C может быть успешно разрешена, исключение, касающееся отказа разрешения самой полевой ссылки, может быть выдано.

Разрешая полевую ссылку, полевое разрешение сначала пытается искать поле, на которое ссылаются, в C и его суперклассах:

  1. Если C объявляет поле с именем и дескриптором, определенным полевой ссылкой, полевой поиск успешно выполняется. Объявленное поле является результатом полевого поиска.

  2. Иначе, полевой поиск применяется рекурсивно к прямым суперинтерфейсам указанного класса или интерфейсу C.

  3. Иначе, если у C есть суперкласс S, полевой поиск применяется рекурсивно к S.

  4. Иначе, полевые сбои поиска.
Если полевой поиск перестал работать, полевое разрешение бросает a NoSuchFieldError. Иначе, если полевой поиск успешно выполняется, но поле, на которое ссылаются, не доступно (§5.4.4) для D, полевое разрешение бросает IllegalAccessError.

Иначе, позвольте <E, L1> быть классом или интерфейсом, в котором поле, на которое ссылаются, фактически объявляется и позволяется L2 быть загрузчиком определения D. Позвольте T быть именем типа поля, на которое ссылаются. Виртуальная машина Java должна наложить загружающееся ограничение это TL1=TL2 (§5.3.4).

5.4.3.3 Разрешение метода

Чтобы разрешить неразрешенную символьную ссылку от D до метода в классе C, символьная ссылка на C, данный ссылкой метода, сначала разрешается (§5.4.3.1). Поэтому, любые исключения, которые могут быть брошены из-за разрешения ссылки класса, могут быть выданы в результате разрешения метода. Если ссылка на C может быть успешно разрешена, исключения, касающиеся разрешения ссылки самого метода, могут быть выданы.

Разрешая ссылку метода:

  1. Разрешение метода проверяет, является ли C классом или интерфейсом.

  2. Разрешение метода пытается искать метод, на который ссылаются, в C и его суперклассах:

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

Если поиск метода перестал работать, разрешение метода бросает a NoSuchMethodError. Если поиск метода успешно выполняется, и метод abstract, но C не abstract, разрешение метода бросает AbstractMethodError. Иначе, если метод, на который ссылаются, не доступен (§5.4.4) для D, разрешение метода бросает IllegalAccessError.

Иначе, позвольте <E, L1> быть классом или интерфейсом, в котором метод, на который ссылаются, фактически объявляется и позволяется L2 быть загрузчиком определения D. Позвольте T0 быть именем типа, возвращенного методом, на который ссылаются, и позволять T1..., Tn быть именами типов параметра метода, на который ссылаются. Виртуальная машина Java должна наложить загружающиеся ограничения TiL1=TiL2 поскольку я = 0 к n (§5.3.4).

5.4.3.4 Интерфейсное Разрешение Метода

Чтобы разрешить неразрешенную символьную ссылку от D до интерфейсного метода в интерфейсе C, символьная ссылка на C, данный интерфейсной ссылкой метода, сначала разрешается (§5.4.3.1). Поэтому, любые исключения, которые могут быть брошены в результате отказа разрешения интерфейсной ссылки, могут быть выданы в результате отказа интерфейсного разрешения метода. Если ссылка на C может быть успешно разрешена, исключения, касающиеся разрешения интерфейсной ссылки метода, могут быть выданы.

Разрешая интерфейсную ссылку метода:

Иначе, позвольте <E, L1> быть интерфейсом, в котором интерфейсный метод, на который ссылаются, фактически объявляется и позволяется L2 быть загрузчиком определения D. Позвольте T0 быть именем типа, возвращенного методом, на который ссылаются, и позволять T1..., Tn быть именами типов параметра метода, на который ссылаются. Виртуальная машина Java должна наложить загружающиеся ограничения TiL1 = TiL2 поскольку я = 0 к n (§5.3.4).

5.4.4 Управление доступом

Класс или интерфейс C доступны для класса или интерфейса D, если и только если любое из следующих условий является истиной:

Поле или метод R доступны для класса или интерфейса D, если и только если любое из следующих условий является истиной:

Это обсуждение управления доступом опускает связанное ограничение на цель a protected доступ к полю или вызов метода (цель должна иметь класс D или подтип D). То требование проверяется как часть процесса проверки (§5.4.1); это не часть разового ссылкой управления доступом.


5.5 Инициализация

Инициализация класса или интерфейса состоит из вызова его статических инициализаторов (§2.11) и инициализаторов для статических полей (§2.9.2) объявленный в классе. Этот процесс описывается более подробно в §2.17.4 и §2.17.5.

Класс или интерфейс могут быть инициализированы только в результате:

До инициализации класс или интерфейс должны быть соединены, то есть, проверены, подготовлены, и дополнительно разрешены.


5.6 Привязка Собственных Реализаций Метода

Привязка является процессом который функция, записанная на языке кроме языка программирования Java и реализующий a native метод интегрируется в виртуальную машину Java так, чтобы это могло быть выполнено. Хотя этот процесс традиционно упоминается как соединение, термин привязка используется в спецификации, чтобы избежать беспорядка с соединением классов или интерфейсов виртуальной машиной Java.


1 Начиная с выпуска 1.1 JDK виртуальная машина Java вызывает loadClass метод загрузчика класса, чтобы заставить это загружать класс или интерфейс. Параметр loadClass имя класса или интерфейса, который будет загружен. Есть также версия с двумя параметрами loadClass метод. Вторым параметром является a boolean это указывает, должны ли класс или интерфейс быть соединены или нет. Только версия с двумя параметрами была предоставлена в выпуске 1.0.2 JDK, и виртуальной машине Java, на которую полагаются это, чтобы соединить загруженный класс или интерфейс. От выпуска 1.1 JDK вперед, виртуальная машина Java соединяет класс, или взаимодействуйте через интерфейс непосредственно, не полагаясь на загрузчик класса.

2 UnsupportedClassVersionError был представлен в Java 2 платформы, Standard Edition, v1.2. В более ранних версиях платформы экземпляр NoClassDefFoundError или ClassFormatError был брошен в случае неподдерживаемой версии в зависимости от того, загружался ли класс системным загрузчиком класса или определяемым пользователем загрузчиком класса.

Содержание | Предыдущий | Следующий | Индекс

Спецификация Виртуальной машины JavaTM
Авторское право © Sun Microsystems, Inc 1999 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к jvm@java.sun.com

free hit counter