第3講 字節碼層面分析 class 類文件結構

第3講 字節碼層面分析 class 類文件結構

拉勾教育:https://kaiwu.lagou.com/course/courseInfo.htm

這一講主要介紹class文件的內部結構,內容相對枯燥但並不難。據說這個東西很重要,不過就目前我所涉及的知識面來講,在實際應用中不大可能會去通過分析class文件來理解一個類的作用,或者進一步去修改class文件。即使要操作class文件也會有工具去處理的,人工去分析的話得要累死。我覺得這節課的意義是瞭解一下class文件的結構,不至於說到class文件心裏就沒底。

一、概念

Class文件是一組以8位字節爲基礎單位的二進制流,當遇到需要8位字節以上空間的數據項時,則會按照高位在前的方式分隔成若干個8位字節進行存儲。

用記事本打開它,你將看到一堆亂碼。這個誰也看不懂,不過可以用16進制編輯器打開它,打開之後就像這樣
在這裏插入圖片描述
所有class文件都像這樣,只是行數有多有少。這樣子看起來好像沒那麼慌了,起碼我認得裏面的數字和字母,這個我小學就學過了。可是這些字母和數字組合在一起代表了什麼呢?這個嘛。。。難道是什麼祕籍使用的暗號??沒錯,就是一些暗號,要是你是內行人,估計查查資料能明白其中的內容代表什麼意思,如果是外行,那跟看到前面的亂碼一樣看不出是什麼意思。

二、class文件結構

要看明白這些暗號,就要了解class的內部結構
在這裏插入圖片描述

這個就class文件的結構,普通人能看明白的。

對應上面的16進制數,如下:
在這裏插入圖片描述

在 class 文件開頭的四個字節是 class 文件的魔數,它是一個固定的值–0XCAFEBABE。 魔數是 class 文件的標誌,也就是說它是判斷一個文件是不是 class 格式文件的標準, 如果開頭四個字節不是 0XCAFEBABE, 那麼就說明它不是 class 文件, 不能被 JVM 識別或加載。

緊跟在魔數後面的兩個字節代表當前 class 文件的版本號。前兩個字節 0000 代表次版本號(minor_version),後兩個字節 0034 是主版本號(major_version),對應的十進制值爲 52,也就是說當前 class 文件的主版本號爲 52,次版本號爲 0。所以綜合版本號是 52.0,也就是 jdk1.8.0

這樣可以推測,這個文件的內容分成了8塊,並按照上面的順序排列在一起的。具體到每一塊對應哪些內容,這就涉及到規則了。
在這裏插入圖片描述

這張表規定了每一塊的數據長度及數據類型,有的塊的長度是固定的,有的塊的長度是可變的,可變的數據長度在數據類型裏有指定具體的長度。

再更詳細的分析就要對着表一點一點去理解。在課程中有詳細的介紹。




由於水平有限,如果文中存在錯誤之處,請大家批評指正,歡迎大家一起來分享、探討!

博客:http://blog.csdn.net/MingHuang2017

GitHub:https://github.com/MingHuang1024

Email: [email protected]

ngHuang1024)

Email: [email protected]

微信:724360018

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章