Как работает Java linker?

Я хочу знать, как работает Java linker. В частности, в каком порядке он объединяет классы, интерфейсы, пакеты, методы и т. д. в JVM-исполняемый формат. Я нашел некоторую информацию здесь, но там не так много информации о порядок подключения.

4 ответов


нет такой вещи, как Java "линкер". Существует, однако, концепция загрузчика классов, который-учитывая массив байтовых кодов java из "Где - то" - может создать внутреннее представление класса, которое затем может использоваться с new etc.

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


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

Итак, вопрос сводится к следующему:как файлы классов ссылок JVM? В JVM Spec вы связаны с Говорит:

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

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

таким образом, на вопрос можно ответить только для конкретной реализации JVM.

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


Ява не связывая путь C делает. Принципиальной единицей является определение класса. Во время выполнения происходит сопоставление ссылки на класс с его определением. Таким образом, вы можете скомпилировать класс против одной версии библиотеки, но предоставить другую версию во время выполнения. Если соответствующие подписи совпадут, все будет в порядке. Во время компиляции есть некоторая подкладка констант, но это все.


Как отмечалось ранее компилятор Java не имеет линкер. Однако JVM имеет фазу связывания, которая выполняется после загрузки класса. Спецификация JVM определяет его в лучшем случае:

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

эта спецификация позволяет гибкости реализации О когда связывание действий (и, из-за рекурсии, загрузка) происходит, при условии, что поддерживаются все следующие свойства:

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

  • класс или интерфейс полностью проверены и подготовлены, прежде чем это инициализированный.

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

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.4