Кіріспе

Орындалатын Java файл пішімі дерек пішімі

Java класы файлы – Java виртуалды машинасымен (JVM) орындалатын Java байт-кодын қамтитын файл (жинақтың атауының кеңейтімімен). Java класы файлы әдетте Java бағдарламалау тілінің бастапқы файлдарынан (.java файлдарынан) Java компиляторы арқылы жасалады (басқаша айтқанда, басқа JVM тілдерін де кластық файлдарды құру үшін қолдануға болады). Егер бастапқы файлда бірнеше класс болса, әр класс жеке кластық файлға компиляцияланады. JVM көптеген платформалар үшін қолжетімді, және бір платформада компиляцияланған кластық файл басқа платформаның JVM-де орындалуы мүмкін. Бұл Java қосымшаларын платформаға тәуелсіз етеді.

Тарих

2006 жылдың 11 желтоқсанында Java Specification Request (JSR) 202 аясында сынып файл форматы өзгертілді.

Сиқырлы сан

Сынып файлдары келесі 4 байттық бас әріптерімен (гексадецималды түрде) анықталады: CA FE BA BE (төмендегі кестедегі алғашқы 4 жазба). Бұл сиқырлы санның тарихын Джеймс Гослинг Пало-Альтодағы бір мейрамханаға сілтеме жасап түсіндірді: "Біз Сент-Михаил аллеясы деп аталатын жерге түскі асқа баратынбыз. Жергілікті аңыз бойынша, бұрын Grateful Dead тобы сол жерде өнер көрсетіп, танымал болған. Бұл өте ерекше орын болатын, ол Grateful Dead тобына лайықты жер еді. Джерри қайтыс болғаннан кейін тіпті буддалық стильдегі шағын құрбандық орны да орнатылды. Біз сол жерге барғанда, оны "Өлілер кафесі" деп атағанбыз. Кейіннен бұл HEX саны екені байқалды. Мен файл форматтарының кодын жаңартып жаттым және маған бірнеше сиқырлы сандар қажет болды: біреуі тұрақты нысан файлы үшін, екіншісі – сыныптар үшін. Мен нысан файл форматы үшін CAFEDEAD қолдандым, ал "CAFE" сөзінен кейін келетін 4 таңбалы гексадецималды сөздерді іздеп (ол жақсы тақырып сияқты көрінді), BABE-ге таптым және оны пайдалануға шешім қабылдадым. Сол кезде бұл аса маңызды немесе тарихтың қоқысқа тасталатын нәрсе сияқты көрінбеді. Осылайша CAFEBABE сынып файл форматына, ал CAFEDEAD – тұрақты нысан форматтарына айналды. Бірақ тұрақты нысан құрылғысы жойылды, сонымен бірге CAFEDEAD-тің қолданылуы да тоқтатылды, ол ақырында RMI-мен алмастырылды."

Тұрақты бассейн

Тұрақты кесте – тұрақты мәндердің көпшілігі сақталатын орын. Бұған сандардың барлық түрлері, жолдар, идентификатор атаулары, сыныптар мен әдістерге сілтемелер және типтік сипаттамалар кіреді. Тұрақты кестедегі нақты тұрақтыларға жасалған барлық сілтемелер 16 биттік (u2 түрі) сандармен беріледі, мұнда 1-ші индекс кестедегі бірінші тұрақтыны білдіреді (0-ші индекс жарамсыз). Файл пішімі дамытылған кезде жасалған тарихи шешімдерге байланысты, тұрақты кестедегі тұрақтылар саны кесте алдындағы тұрақты кесте санымен сәйкес келмейді. Біріншіден, кесте 1-ден (0 емес) бастап индекстеледі, ал сан ең жоғары индекс плюс бір ретінде түсіндірілуі керек. Сонымен қатар, екі типті тұрақты (ұзын және қос) кестеде екі орынды алады, бірақ екінші орын тікелей қолданылмаған «фантомдық» индекс болып табылады. Тұрақты кестедегі әр элементтің (тұрақтының) түрі бастапқы байт тағымен анықталады. Осы тақтың артындағы байттардың саны мен олардың мағынасы тақтың мәніне байланысты. Қолданылатын тұрақты түрлері мен олардың таңбалары:

Таңба байты Қосымша байттар Тұрақтының сипаттамасы Версиясы енгізілген 1 2+x байт (айнымалы) UTF-8 (Unicode) жолы: 16 биттік санмен (u2 түрі) алдын ала берілген таңбалар тізбегі, ол бірден кейін келетін кодталған жолдағы байттар санын көрсетеді (бұл таңбалар санынан өзгеше болуы мүмкін). Қолданылатын кодтама шын мәнінде UTF-8 емес, бірақ Unicode стандартының кодтама түрінің сәл өзгертілген нұсқасы екенін ескеріңіз. 1.0.2 3 4 байт Бүтін сан: үлкен енділік форматындағы қол қойылған 32 биттік екілік толықтыру нөмірі 1.0.2 4 4 байт Жылжымалы нүкте: 32 биттік бір дәлдікті IEEE 754 жылжымалы нүкте нөмірі 1.0.2 5 8 байт Ұзын сан: үлкен енділік форматындағы қол қойылған 64 биттік екілік толықтыру нөмірі (тұрақты кестеде екі орын алады) 1.0.2 6 8 байт Қос жылжымалы нүкте: 64 биттік екі дәлдікті IEEE 754 жылжымалы нүкте нөмірі (тұрақты кестеде екі орын алады) 1.0.2 7 2 байт Сыныпқа сілтеме: тұрақты кестедегі UTF-8 жолына сілтеме, онда сыныптың толық атауы (ішкі форматта) бар (үлкен енділік). 1.0.2 8 2 байт Жолға сілтеме: тұрақты кестедегі UTF-8 жолына сілтеме (сонымен қатар үлкен енділік). 1.0.2 9 4 байт Лауазымға сілтеме: тұрақты кестедегі екі индекс, біріншісі Сыныпқа сілтемеге, екіншісі Атау және Тип сипаттамасына сілтеме жасайды (үлкен енділік). 1.0.2 10 4 байт Әдіске сілтеме: тұрақты кестедегі екі индекс, біріншісі Сыныпқа сілтемеге, екіншісі Атау және Тип сипаттамасына сілтеме жасайды (үлкен енділік). 1.0.2 11 4 байт Интерфейс әдісіне сілтеме: тұрақты кестедегі екі индекс, біріншісі Сыныпқа сілтемеге, екіншісі Атау және Тип сипаттамасына сілтеме жасайды (үлкен енділік). 1.0.2 12 4 байт Атау және типтік сипаттама: тұрақты кестедегі UTF-8 жолына екі сілтеме, біріншісі атауды (сәйкестендіргішті) білдіреді, екіншісі арнайы кодталған типтік сипаттаманы білдіреді. 1.0.2 15 3 байт Әдіс тұтқасы: Бұл құрылым әдіс тұтқасын көрсету үшін қолданылады және бір байт типтік сипаттамадан және тұрақты кестедегі индекстен тұрады. 7 16 2 байт Әдіс түрі: Бұл құрылым әдіс түрін көрсету үшін қолданылады және тұрақты кестедегі индекстен тұрады. 7 17 4 байт Динамикалық: Бұл боутстрап әдісін шақыру арқылы жасалған динамикалық есептелген тұрақтыны көрсету үшін қолданылады. 11 18 4 байт InvokeDynamic: Бұл invokedynamic нұсқаулығы боутстрап әдісін, динамикалық шақыру атауын, шақыру аргументтері мен қайтарым түрлерін және, мүмкін болса, боутстрап әдісіне берілетін статикалық аргументтер деп аталатын қосымша тұрақтылар тізбегін көрсету үшін қолданылады. 7 19 2 байт Модуль: Бұл модульді анықтау үшін қолданылады. 9 20 2 байт Пакет: Бұл модуль экспорттаған немесе ашқан пакетті анықтау үшін қолданылады. 9

Тек екі бүтін сан тұрақты түрі бар: бүтін сан және ұзын сан. Жоғары деңгейдегі тілде кездесетін басқа бүтін сан түрлері, мысалы, логикалық, байт және қысқа, бүтін сан тұрақтысы ретінде көрсетілуі керек. Java-дағы сынып атаулары, толыққанды болғанда, әдетте нүктелермен бөлінеді, мысалы "java.lang.Object". Алайда, төменгі деңгейдегі Сыныпқа сілтеме тұрақтыларында, оның орнына қисық сызықтарды қолданатын ішкі форма пайда болады, мысалы "java/lang/Object". Unicode жолдары, «UTF-8 жолы» деген атауына қарамастан, Unicode стандартына сәйкес кодталмайды, бірақ оған ұқсас. Екі айырмашылық бар (толық талқылау үшін UTF-8 қараңыз). Біріншісі, U+0000 кодтық нүктесі стандартты бір байттық кодтау 00 орнына C0 80 (он алтылық) екі байттық ретінде кодталады. Екінші айырмашылық – қосымша таңбалар (U+10000 және одан жоғары BMP-ден тыс таңбалар) UTF-16 сияқты жұптық құрылымды қолдана отырып кодталады, UTF-8 арқылы тікелей кодталмайды. Бұл жағдайда, екі жұптың әрқайсысы UTF-8-де жеке кодталады. Мысалы, U+1D11E 6 байттық тізбек ED A0 B4 ED B4 9E ретінде кодталады, дұрыс 4 байттық UTF-8 кодтауы F0 9D 84 9E орнына.