Почему пул констант (в Java-файле классов) индексируется из 1 (а не 0)? Для чего предназначена запись constant_pool [0]? - PullRequest
4 голосов
/ 28 июня 2019

В спецификациях JVM ( Глава 4.1"Структура ClassFile") указано, что "таблица constant_pool индексируется от 1 до constant_pool_count - 1."

Мне любопытно, почему они пропускают [0] и для чего предназначена эта запись.

Ответы [ 2 ]

5 голосов
/ 28 июня 2019

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

Наиболее заметное использование индекса 0 - это обработчики исключений "catch all". Обработчик исключений может либо указывать на запись постоянного пула для класса исключений, которые он хочет обработать, либо просто использовать индекс 0, чтобы перехватить все (это эквивалентно перехвату java/lang/Throwable). На практике компилятор будет генерировать перехват всех обработчиков исключений для реализации блоков finally, synchronized, а также части очистки try с ресурсами, среди прочего.

Другие значения индекса 0 включают:

  • Суперкласс java/lang/Object
  • Имя параметра без имени
  • Внешний класс для классов, которые не являются членами другого класса (т.е. классы верхнего уровня, локальные классы и анонимные классы)
  • Внутреннее имя анонимных классов
  • Метод включения для классов, которые не включены сразу в метод
  • Информация о версии для модуля без информации о версии
  • Зависимости для модуля без информации о зависимостях
1 голос
/ 28 июня 2019

Нет зарезервированной записи.«[I] ndexed from 1» означает, что первая запись в пуле констант соответствует индексу 1, поэтому не существует никакого constant_pool [0].Скорее, существует зарезервированный индекс , 0, который точно известен как недопустимый индекс в пуле констант.

Документированное использование этого зарезервированного индекса кажется редким, нопо крайней мере, в разделе 4.7.24 указано использование: имена параметров метода представлены индексами в пуле констант, а для безымянных параметров этот индекс задан как 0.

Обратите внимание, что имя constant_pool_countвводит в заблуждение.В спецификации прямо сказано, что в пуле констант есть только constant_pool_count - 1 записей (см. Объявление структуры в верхней части раздела 4.1 и сравните его с некоторыми другими членами).

...