Спецификация файла класса Java - двойное и длинное представление

В спецификации файла класса Java, в разделе о длинном и двойном представлении, документ гласит:

CONSTANT_Long_info и CONSTANT_Double_info представляют 8-байтовые числовые (длинные и двойные) константы:

CONSTANT_Long_info {
    u1 tag;
    u4 high_bytes;
    u4 low_bytes;
}

CONSTANT_Double_info {
    u1 tag;
    u4 high_bytes;
    u4 low_bytes;
}

Все 8-байтовые константы занимают две записи в таблице constant_pool файла класса. Если структура CONSTANT_Long_info или CONSTANT_Double_info является элементом в таблице constant_pool с индексом n, то следующий используемый элемент в пуле находится с индексом n+2. Индекс constant_pool n+1 должен быть действительным, но считается непригодным.

Мое сомнение в том, что tag записи в constant_pool в индексе n+1,

2 ответа

Нет тега в индексе n+1 потому что нет постоянной записи пула в индексе n+1, Это как индекс 0. Там нет данных для него, и он сразу переходит к следующей записи.

Методом проб и ошибок, и с помощью комментариев Tassos Bassoukos, я Tassos Bassoukos решение. Когда найден постоянный длинный или двойной индекс n индекс в n+1 не usd, только это.

Я покажу с кодом:

List<Constant> constants = new ArrayList<>();
byte[] bytecode = ... // reads the class byte code
int constantPoolCount = getConstantPoolCount(bytecode);
int offset = getConstantPoolStartOffset(bytecode);

for(int i = 1; i < constantPoolCount; i++){
  int tag = bytecode[offset];
  offset++;

  if(tag == LONG_CONSTANT_TAG) {
    byte[] highBytes = Arrays.copyOfRange(bytecode, offset, offset+4);
    offset += 4;
    byte[] lowBytes = Arrays.copyOfRange(bytecode, offset, offset+4);
    offset += 4;

    ConstantLong c = new ConstantLong(highBytes, lowBytes);
    constants.add(c);

    // because we are at CONSTANT LONG, the entry at n+1 is not used
    constants.add(null);
    i++;

  } else if(tag == DOUBLE_CONSTANT_TAG) {
    ... // performs the same, like LONG_CONSTANT_TAG
  }

  // read more entries without skip indexes.

}

Обратите внимание, что constants список индексируется начиная с нуля, а записи в constant_pool Байт-код индексируется, начиная с 1.

Другие вопросы по тегам