Файл класса Java - это структура данных, которая соответствует указанному формату .
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
Записи данных константного пула соответствуют следующим общим указаннымформат где тег определяет длину информации.
cp_info {
u1 tag;
u1 info[];
}
, за исключением случаев, когда tag = CONSTANT_Utf8, затем следует следующий указанный формат .
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
- Read constant_pool_count - он находится в фиксированной позиции в структуре.constant_pool_count = размер постоянного пула + 1. Поскольку постоянный пул не является структурой с фиксированным размером, необходимо знать constant_pool_count для чтения остальной части структуры.
- Считывание через постоянный пул.Начало пула констант находится в фиксированной позиции.Прочитайте тег i-й записи.Если tag == CONSTANT_Utf8_info, вам нужно прочитать длину, иначе вы можете определить длину записи только по тегу.Независимо от того, вы знаете начальное местоположение i + 1-й записи.Повторяйте эту процедуру до тех пор, пока не закончите пул констант.Запишите начальное местоположение всех постоянных записей пула.
- Теперь вы знаете местоположение этого_класса.Он фиксируется относительно конца постоянного пула.Это индекс в константном пуле.
- Поскольку вы записали начальное местоположение всех записей константного пула, вы можете посмотреть его.Вы должны обнаружить, что тег == Constant_ClassInfo и его информация также являются индексом в пуле констант.
- Найдите его.Вы должны найти этот тег == Constant_Utf8_info.Информация, связанная с этой записью, представляет собой полное имя класса, закодированное во внутренняя форма .«java / lang / Thread» вместо «java.lang.Thread».
. Это, вероятно, будет связано с именем файла.