поиск имени класса - PullRequest
       3

поиск имени класса

1 голос
/ 02 июля 2010

Мне нравится знать, "как найти имя класса из файла .class". Я надеюсь, что вы объясните это как можно яснее, потому что я знаю только основы Java.

Ответы [ 3 ]

3 голосов
/ 03 июля 2010

Файл класса 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];
}
  1. Read constant_pool_count - он находится в фиксированной позиции в структуре.constant_pool_count = размер постоянного пула + 1. Поскольку постоянный пул не является структурой с фиксированным размером, необходимо знать constant_pool_count для чтения остальной части структуры.
  2. Считывание через постоянный пул.Начало пула констант находится в фиксированной позиции.Прочитайте тег i-й записи.Если tag == CONSTANT_Utf8_info, вам нужно прочитать длину, иначе вы можете определить длину записи только по тегу.Независимо от того, вы знаете начальное местоположение i + 1-й записи.Повторяйте эту процедуру до тех пор, пока не закончите пул констант.Запишите начальное местоположение всех постоянных записей пула.
  3. Теперь вы знаете местоположение этого_класса.Он фиксируется относительно конца постоянного пула.Это индекс в константном пуле.
  4. Поскольку вы записали начальное местоположение всех записей константного пула, вы можете посмотреть его.Вы должны обнаружить, что тег == Constant_ClassInfo и его информация также являются индексом в пуле констант.
  5. Найдите его.Вы должны найти этот тег == Constant_Utf8_info.Информация, связанная с этой записью, представляет собой полное имя класса, закодированное во внутренняя форма .«java / lang / Thread» вместо «java.lang.Thread».

. Это, вероятно, будет связано с именем файла.

1 голос
/ 02 июля 2010

Имя класса обычно, но не всегда, имя файла. Попробуйте использовать следующую команду:

javap -public -classpath . FileName

Где «filename» не включает суффикс «.class».

javap - дизассемблер файлов классов Java, а ключ -public отображает открытые классы и члены. В Java classpath - это каталог или каталоги, в которых среда выполнения Java будет искать файлы классов. Подставьте "." для каталога интересующего вас файла, если его нет в вашем текущем каталоге.

0 голосов
/ 02 июля 2010

Обычно имя класса предшествует .class, поэтому ClassName.class является соглашением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...