Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Содержимое .class файла

#java #классы


В одном проекте нашел файл расширения .class с вот таким содержанием

cafe babe 0000 0032 005f 0700 0201 0015
6e65 742f 6d63 676c 2f4d 4347 4c4c 6175
6e63 6865 7207 0004 0100 106a 6176 612f


и так далее около 70 строк.
Что это такое?
    


Ответы

Ответ 1



Это обычный исполняемый файл программы или библиотеки, предназначенной для выполнения на виртуальной машине Java. Очевидно, вы открыли его редактором, который отображает содержимое нетекстовых файлов в шестнадцатиричном представлении. Шестнадцатиричная последовательность 0xCAFEBABE - сигнатура заголовка .class-файла согласно стандарта.

Ответ 2



То что вы обнаружили, называется байткодом. Это набор инструкций, который является промежуточным между исходным кодом и машинным кодом. В дальнейшем он либо интерпретируется, либо компилируется jit компилятором в машинный. Как известно, java кроссплатформенный язык. Из за этого исходный код компилировать в машинный сразу под все платформы крайне затруднительно. Поэтому, придумали байткод. Он не привязан к конкретной архитектуре, но при этом разбирает исходный код на мелкие инструкции, позволяющие производить некоторые оптимизации. Формат данного файла описан в спеке. Для дизассемблирования байткода можно воспользоваться стандартной утилитой javap

Ответ 3



0xcafebabe точнее CA FE BA BE - это стандартная сигнатура .class файла Java - об этом уже все сказали. Имеется немало легенд почему выбрана такая сигнатура cafebabe - кафешная красотка, по словам Джеймса Гослинга (для тех кто в танке - создателя языка Java): "We used to go to lunch at a place called St Michael's Alley. According to local legend, in the deep dark past, the Grateful Dead used to perform there before they made it big. It was a pretty funky place that was definitely a Grateful Dead Kinda Place. When Jerry died, they even put up a little Buddhist-esque shrine. When we used to go there, we referred to the place as Cafe Dead. Somewhere along the line it was noticed that this was a HEX number. I was re-vamping some file format code and needed a couple of magic numbers: one for the persistent object file, and one for classes. I used CAFEDEAD for the object file format, and in grepping for 4 character hex words that fit after "CAFE" (it seemed to be a good theme) I hit on BABE and decided to use it. At that time, it didn't seem terribly important or destined to go anywhere but the trash-can of history. So CAFEBABE became the class file format, and CAFEDEAD was the persistent object format. But the persistent object facility went away, and along with it went the use of CAFEDEAD - it was eventually replaced by RMI. В русском толковании звучит примерно следующим образом (переведен только смысл, опущены несущественные детали): Мы частенько захаживали в один ресторанчик (во времена когда мы создавали язык Java). Согласно местной легенде в стародавние времена в этом ресторанчике выступала местная рок-группа "Благодарный Мертвец" (Grateful Dead), которая потом стала очень известной. Мы промежь себя так и называли ресторанчик "У мертвеца" (Cafe Dead). Однажды кто-то заметил, что CAFEDEAD составлено из HEX символов CA FE DE AD - я потом применил это как сигнатуру для формата объектных файлов Java. Слово CAFE - вообще было "в тему" (на американском сленге Java означает второсортный кофе), для .class файлов я выбрал вместо DEAD - BABE (красотка), тогда никто не думал, что это так важно. Так и появилась сигнатура CAFEBABE, а CAFEDEAD в итоге умер и заменен протоколом RMI. Где-то слышал, что BABE был также выбран далеко не случайно, дескать кто-то из команды флиртовал с девицей, которая обслуживала их в этом ресторанчике.

Комментариев нет:

Отправить комментарий