JVMS §5.4.Связывание состояний:
Связывание класса или интерфейса включает проверку и подготовку этого класса или интерфейса, его прямого суперкласса, его прямых суперинтерфейсов и типа его элемента (если это тип массива),если необходимо.Разрешение символьных ссылок в классе или интерфейсе является необязательной частью связывания.
Поэтому, если не говорить о прямых супертипах класса, разрешение будет необязательно и может бытьdeferred.
Этот же раздел также содержит
Например, реализация виртуальной машины Java может выбрать разрешение каждой символьной ссылки в классе или интерфейсе индивидуально, когда она используется ("lazy"«или« позднее »разрешение), или разрешить их все сразу, когда класс проверяется (« нетерпеливое »или« статическое »разрешение).Это означает, что процесс разрешения может продолжаться в некоторых реализациях после инициализации класса или интерфейса.
Таким образом, процесс не всегда строго следует графику, который вы показали в вопросе.Вместо этого разрешение можно рассматривать как непрерывный процесс.
На практике, в случае JSM HotSpot, некоторые классы должны быть разрешены немедленно, как суперклассы.Другие классы разрешаются при проверке кода метода, который происходит непосредственно перед первым выполнением метода для этой JVM.
Это не влияет на все классы, на которые ссылается код метода, но зависит от фактического использования типа,например, верификатор HotSpot будет разрешать типы для проверки действительности назначений по фактической иерархии типов, но пропустите этот шаг, если тип назначен самому себе или java.lang.Object
, то есть где назначение всегда допустимо.Поэтому некоторые типы могут быть разрешены только при их первом фактическом использовании, например, когда они создаются с помощью метода new
или static
, объявленного типом.Но это зависит от тонких аспектов кода.См. Также Когда загружается класс Java? или Выдает ли JVM отсутствие отсутствующего класса?
Могут быть типы, на которые ссылаются только в отражающих данных, таких как аннотацииили отладочные атрибуты, которые никогда не разрешаются во время выполнения, но могут быть в другом.
Но поскольку это подразумевает, что разрешение типа откладывается до того момента, когда оно действительно необходимо, оно также подразумевает, что право наВ этот момент операция остановится и будет ждать завершения этого процесса для обязательных классов.Так, например, загрузка класса всегда подразумевает разрешение его прямого суперкласса, загрузку его, если он еще не загружен, что, в свою очередь, подразумевает разрешение суперкласса суперкласса и так далее.Так что он не вернется, пока не будет решена полная иерархия суперклассов.