.java文件通過javac編譯器編譯後會生成對應的.class文件,對java而言程序的執行都是在jvm中進行的,所以class文件的結構必然要知足jvm的標準;.class是格式嚴謹的二進制文件,沒有任何的空白符和分隔符,必須嚴格按照JVM標準排列;可使用javap -c命令反編譯獲得更易閱讀的字節碼文件html
顧名思義,這三個字段分別存儲着class文件的魔數,class文件的副版本號和主版本號
值得一提的是magic字段的值自Oak時代就被肯定爲0XCAFEBABE,這也許就是爲何java和javaer都和咖啡有着深厚的不解之緣java
cp_info {u1 tag;u1 info[];}
;u1 tag;u2 length;u1 bytes[length];
,用來存儲全限定類名、方法名、字段名等,length字段使用了u2存儲,所以最大隻能爲65535Byte;u1 tag;u2 name_index;u2 descriptor_index;
,其中name_index存儲的值爲一個CONSTANT_Utf8_info常量在常量池中的下標,該CONSTANT_Utf8_info表示了一個field或method的名稱,或<init>,descriptor_index存儲的值爲一個CONSTANT_Utf8_info常量在常量池中的下標,該CONSTANT_Utf8_info表示了一個field或method的描述符信息;u1 tag;u2 class_index;u2 name_and_type_index;
,用來存儲類的字段信息,其中class_index存儲的值表示一個CONSTANT_Class_info常量在常量池中的下標,該CONSTANT_Class_info存儲了此field所在類的類名信息,name_and_type_index存儲的值表示一個CONSTANT_NameAndType_info常量在常量池中的下標,該CONSTANT_NameAndType_info表示了此field的name和描述符信息,相似結構的還有CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info;u1 tag; u1 reference_kind; u2 reference_index;
,其中reference_kind目前僅有1-9九個值,分別表明不一樣的methodHandle類型,不一樣值表明的含義能夠參考官方文檔,針對不一樣值的reference_kind,reference_index將分別指向CONSTANT_Fieldref_info或CONSTANT_Methodref_info或CONSTANT_InterfaceMethodref_info,用來對methodHandle的內容作更爲詳盡的描述;u1 tag; u2 bootstrap_method_attr_index; u2name_and_type_index;
,bootstrap_method_attr_index表示所使用的引導方法在class文件中的引導方法表中的下標,CONSTANT_NameAndType_info表示一個CONSTANT_NameAndType_info常量在常量池中的下標,該CONSTANT_NameAndType_info存儲着會動態生成的field或method的描述信息用來表示類或接口的訪問權限,以及內部元素的標誌信息,須要注意的是access_flags被定義爲掩碼,所以雖然使用的是u2類型,但僅有16個標誌位可使用,每一個access_flag僅在一個標誌位上爲1,其餘位所有爲0,目前定義了九個,分別用來標識public/final/super/interface/abstract/synthetic/annotation/enum/module,具體解釋能夠參考官方文檔bootstrap
《深刻理解Java虛擬機》數組
Oracle JVMS數據結構