Class 文件是一組以8位字節為基礎單位的二進制流。
類似下圖,0-3是一組。4-7是一組。
Class 文件是類似與c語言結構的偽結構來存儲數據的。由兩種數據類型組成:
【1】 無符號數。 基本數據類型。以u1,u2,u4,u8。來代表1個字節、2個字節、4個字節、8個字節的無符號數。無符號數可以用來表示,數字,索引引用,數量值,字符串值。
【2】表。以多個無符號數或者表組成的復合型數據結構。已_info結尾。class 文件本質就是一張表。
1? 魔數 與class 版本。
魔數就是文件開頭的4個字節,如上面的 cafebabe,來確定文件格式。
https://www.cnblogs.com/mq0036/p/3912355.html
摘要幾個。
JPEG (jpg),文件頭:FFD8FF?
PNG (png),文件頭:89504E47?
GIF (gif),文件頭:47494638?
TIFF (tif),文件頭:49492A00?
Windows Bitmap (bmp),文件頭
接著的? 00 00 00 34 ,分別代表,次版本號(00 00)和主板本號(00 34)。
2 常量池
版本過后緊接著 就是常量池。先由一個u2 類型的數據,保存該類的常量池大小。 如上8-9(00 1d),換成 10進制是 29。 也就是 有28個常量, 索引 范圍是 1-28。
常量池 放的是? 字面量和 符號引用。
字面量 : 字符串,修飾為final的常量。
符號引用:類和接口的全限定名。? 字段名稱和描述符。 方法名稱和描述符。
常量池中為什么要包含這些內容?
class文件不會保各個方法 字段的最終內存布局信息,因為這些方法,字段,不經過運行期轉換無法得到真正的內存信息。
虛擬機在運行時,會從常量池獲得對應的符號引用,再在類創建時或運行時解析,翻譯到具體的內存入口。
常量池的一共有 14 種常量。如下:
其中 1-8 是 字面量。? 9-18 是 符號引用。
上述的14種常量,每一種都有自己的數據結構。
下面 有一片博客專門介紹 如何分析 : 生成 的 class 文件。
http://www.lxweimin.com/p/4224b896516e
3 訪問標志
根據上面的表格,測試類的訪問標志為ACC_PUBLIC | ACC_SUPER = 0x0001 | 0x0020 =1 | 32 = [00000000][00000001] | [00000000][00010000] = [00000000][00010001] = 33 = 0x0021 。
是 普通類,不是接口、枚舉或注解、被public 聲明但沒有聲明? final 和 abstract ,并且使用了 1.2 jdk 作編輯器。
類索引,接口索引集合,父類索引。
0003 是 類索引? ,0004 是 父類 索引,0001 是接口集合大小,后面的 0005 是實現的接口。占一個 u2。從左到右。