Что такое назначение флага доступа ACC_SUPER в файлах классов Java?

invokespecial инструкция JVM используется для вызова методов инициализации ( ) при создании нового o объекты. Описание инструкции предполагает (но не поясняет), что решение о том, вызывать ли конструктор суперкласса или конструктор текущего класса, зависит от состояния флага ACC_SUPER , установленного в файл класса .

Из спецификации Sun JVM:

Затем разрешенный метод выбирается для вызова, если не выполняются все следующие условия:

  • Флаг ACC_SUPER (см. Таблицу 4.1, «Доступ к классам и модификаторы свойств») равен установлен для текущего класса.

- Источник ( определение кода операции invokespecial )

Установка флага ACC_SUPER указывает, какую из двух альтернативных семантик для своей специальной инструкции вызова виртуальная машина Java должна выразить; флаг ACC_SUPER существует для обратной совместимости для кода, скомпилированного более старыми компиляторами Sun для языка программирования Java. Все новые реализации виртуальной машины Java должны реализовывать семантику для специальных вызовов, задокументированную в этой спецификации. Все новые компиляторы для набора команд виртуальной машины Java должны устанавливать флаг ACC_SUPER. Старые компиляторы Sun генерировали флаги ClassFile с неустановленным ACC_SUPER. Более старые реализации виртуальных машин Java от Sun игнорируют этот флаг, если он установлен.

- Источник ( формат ClassFile )

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

Флаг все еще используется с кодом операции invokes special ? Насколько я могу судить, это кажется бесполезным, и я не могу найти источник, чтобы предположить, что это когда-либо было.

Спасибо.

27
задан Jivings 21 January 2012 в 01:51
поделиться