Как работает компоновщик Java? - PullRequest
11 голосов
/ 22 июня 2011

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

Ответы [ 4 ]

13 голосов
/ 22 июня 2011

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

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

12 голосов
/ 22 июня 2011

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

Итак, возникает вопрос: какФайлы классов ссылок JVM?Спецификация JVM, на которую вы ссылаетесь, гласит:

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

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

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

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

8 голосов
/ 22 июня 2011

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

3 голосов
/ 02 января 2016

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

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

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

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

  • Класс или интерфейс полностью проверяются и подготавливаются перед инициализацией.

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

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

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