Спецификация файла класса 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.