JVM(五) class類文件的結構
概述
class類文件的結構可見下面這樣圖(出處見參考資料),可以參照下面的例子,對應十六進制碼,找出找出相應的信息。
其中u2 , u4 表示的意思是占用兩個字節和占用四個字節,下面我們將會各項說明。
class類文件結構
Class 文件是一組以8 字節位單位的二進制流,各個數據按照一定的順序排放,Class文件采用一種類似於C語言結構體的偽結構來存儲數據。
例如下面代碼使用java編譯後,生成的class 文件。
public class TestClass { private int m; private int inc(){ return m+1; } }
cafe babe 0000 0034 0013 0a00 0400 0f09 0003 0010 0700 1107 0012 0100 016d 0100 0149 0100 063c 696e 6974 3e01 0003 2829 5601 0004 436f 6465 0100 0f4c 696e 654e 756d 6265 7254 6162 6c65 0100 0369 6e63 0100 0328 2949 0100 0a53 6f75 7263 6546 696c 6501 000e 5465 7374 436c 6173 732e 6a61 7661 0c00 0700 080c 0005 0006 0100 0954 6573 7443 6c61 7373 0100 106a 6176 612f 6c61 6e67 2f4f 626a 6563 7400 2100 0300 0400 0000 0100 0200 0500 0600 0000 0200 0100 0700 0800 0100 0900 0000 1d00 0100 0100 0000 052a b700 01b1 0000 0001 000a 0000 0006 0001 0000 0001 0002 000b 000c 0001 0009 0000 001f 0002 0001 0000 0007 2ab4 0002 0460 ac00 0000 0100 0a00 0000 0600 0100 0000 0400 0100 0d00 0000 0200 0e
在概述中我們已經給出了,class類文件的文件結構,各個項在上圖可以對應到。文章沒有給出詳細的各項結構,需要詳細地了解各個項的數據結構可以到官網查看。
下面介紹各個項所代表的含義和信息。
magic
唯一的作用就是識別是否是JVM 可以執行的文件,class文件的魔術為16進制的“CAFE BABE”,這讓人不禁想起java圖標上那杯咖啡。
minor_version 和 major_version
作用就是識別該class 是否適合該JVM 執行。
constant_pool_count 和 cp_info
常量池中常量數量和各項常量,各項常量的格式是不同的
access_flags
用於標識一些類或者接口層次的訪問信息,包括 : 這個class 是類還是接口;是否定義為public類型;是否定義為abstract類型;如果是類的話,是否被聲明為final 等。
this_class super_class 和 interfaces_count interfaces[interfaces_count]
this_class 用於確定這個類的全限定名,super_class 用於確定這個類的父類的全限定名;
interface 用於確定這個類繼承的接口
fields_count fileds[fields_count]
字段表用於描述接庫或者類中聲明的變量。字段包括類級變量(static 修飾)和以及實例級變量,但不包括方法內聲明的局部變量。
methods_count 和 methods[methods_count]
用來描述該類各個方法的。
attributes_count attributes[atttributes_count]
在class文件,字段表,方法表都可以攜帶自己的屬性表集合,和具體值放在常量池,而持有一個index這種的方式相同,attribute存放的是具體值,而字段表,或是方法表持有attribute index 就可以了,attribute (屬性)以用於描述某些場景專有的信息。
下圖為 Code 屬性的結構。
可以看到Code屬性有個名稱為code的項,裏面放的就是我們代碼轉化成的字節碼,例如方法裏的邏輯等。
javap 指令
javap命令的作用是可以反匯編類文件。
The javap command disassembles one or more class files. Its output depends on the options used. If no options are used, javap prints out the package, protected, and public fields and methods of the classes passed to it. javap prints its output to stdout.
解析的內容可以看這一篇文章 : javap解析
參考資料
- 官方文檔
- https://www.jianshu.com/p/6a8997560b05
JVM(五) class類文件的結構