2010-07-02 5 views
1

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

ответ

0

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

+0

Это не поможет, если разработчик имеет более одного класса в файле. – duffymo

+1

У меня создалось впечатление, что компилятор создаст несколько файлов .class из одного .java-файла, если это так. – plor

1

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

javap -public -classpath . FileName 

Где «имя файла» не включает в себя «.class» суффикс.

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

3

Файл класса java - это структура данных, которая следует за specified format.

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]; 
} 

Постоянные записи пула данных следуют следующие общие specified format где тег определяет длину информации.

cp_info { 
u1 tag; 
u1 info[]; 

}

за исключением того, если тег = CONSTANT_Utf8 то следующий specified format следует.

CONSTANT_Utf8_info { 
    u1 tag; 
    u2 length; 
    u1 bytes[length]; 
} 
  1. Чтение constant_pool_count - Он находится в фиксированном положении в структуре. constant_pool_count = размер пула констант + 1. Поскольку постоянный пул не является структурой фиксированного размера, необходимо знать константу_путь_компонент, чтобы прочитать остальную часть структуры.
  2. Прочитайте постоянный пул. Начало постоянного пула находится в фиксированном положении. Прочтите тег i-й записи. Если tag == CONSTANT_Utf8_info, вам нужно прочитать длину, иначе вы можете определить длину записи только тегом. Независимо от того, вы знаете начальное местоположение i + 1-й записи. Повторите эту процедуру до тех пор, пока вы не закончите постоянный пул. Запишите начальное местоположение всех записей с постоянным пулом.
  3. Теперь вы знаете местоположение этого_класса. Он фиксируется относительно конца пула констант. Это индекс в постоянный пул.
  4. Поскольку вы записали начальное местоположение всех постоянных записей в пул, вы можете посмотреть его. Вы должны обнаружить, что тег == Constant_ClassInfo и его информация также являются индексом в пуле констант.
  5. Посмотрите. Вы должны найти тег == Constant_Utf8_info. Информация, связанная с этой записью, - это полное имя класса, закодированное в internal form. «java/lang/Thread» вместо «java.lang.Thread».

. Вероятно, это связано с именем файла.

+0

+1 Для этого подробного и правильного ответа вы заслуживаете гораздо больше, чем один или два оборота. Хорошая работа! – PeterK