Class文件結構分析

Class文件結構分析

1. Class文件的結構概覽圖

在這裏插入圖片描述

2. 每一項數聽說明

類型 名稱 數量 說明
u4 magic 1 魔數:肯定一個文件是不是Class文件
u2 minor_version 1 Class文件的次版本號
u2 major_version 1 Class文件的主版本號:一個JVM實例只能支持特定範圍內版本號的Class文件(能夠向下兼容)。
u2 constant_pool_count 1 常量表數量
cp_info constant_pool constant_pool_count-1 常量池:以理解爲Class文件的資源倉庫,後面的其餘數據項能夠引用常量池內容。
u2 access_flags 1 類的訪問標誌信息:用於表示這個類或者接口的訪問權限及基礎屬性。
u2 this_class 1 指向當前類的常量索引:用來肯定這個類的的全限定名。
u2 super_class 1 指向父類的常量的索引:用來肯定這個類的父類的全限定名。
u2 interfaces_count 1 接口的數量
u2 interfaces interfaces_count 指向接口的常量索引:用來描述這個類實現了哪些接口。
u2 fields_count 1 字段表數量
field_info fields fields_count 字段表集合:描述當前類或接口聲明的全部字段。
u2 methods_count 1 方法表數量
method_info methods methods_count 方法表集合:只描述當前類或接口中聲明的方法,不包括從父類或父接口繼承的方法。
u2 attributes_count 1 屬性表數量
attributes_info attributes attributes_count 屬性表集合:用於描述某些場景專有的信息,如字節碼的指令信息等等。

3. Class文件16進制解析

3.1 魔數。
  • Class文件開始是4個字節定義爲魔數(Magic Number);
  • 惟一做用:肯定一個文件是不是Class文件;
  • 魔數能夠自由選擇,只要沒有普遍使用並且不會引發混淆的便可,這樣就不會由於擴展名改變而沒法識別;其餘許多文件類型格式頭都存在魔數,如gif、jpeg等
  • Class文件的魔數爲"0xCAFEBABE"(咖啡寶貝),比照ClassFileTest.class以下:
3.2 方法表解析
  • public void bar()
00 01 訪問控制符 public 
00 11 這裏11是16進制轉10進製爲17,對應 Constant pool: #17 = Utf8 bar
00 0b 描述符0b是16進制轉10進製爲11,對應 Constant pool: #11 = Utf8 ()V
翻譯過來:public void bar()

00 01 表示有1個屬性表attribute_count
屬性表attribute_info(u2,u4,u1*length)
00 0c 表示attribute_name_index,索引,這裏0c是16進制轉10進製爲12,對應 Constant pool: #12 = Utf8 Code
00 00 00 38 表示attribute_length,代碼佔的大小,這裏38是16進制轉10進製爲56,表示bar()方法佔了56個字節

00 02 表示max_stack最大棧深是2
00 01 表示max_locals最大變量數是1
00 00 00 0a 表示code_length代碼行數,這裏0a是16進制轉10進製爲10

args_size 方法的參數有多少個(默認是this,若是方法是static那麼就是0)

對應字節碼
   00 02 00 01 00 00 00 0a b2 00 02 b2 00 03 b6 
00 04 b1 00 00 00 02 00 0d 00 00 00 0a 00 02 00 
00 00 0f 00 09 00 10 00 0e 00 00 00 0c 00 01 00 
00 00 0a 00 0f 00 10 00 00  

b2 getstatic
00 nop
03 iconst_0
b6 invokevirtual
04 iconst_1

本地行號表
LineNumberTable:
        line 15: 0
        line 16: 9

本地變量表
LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0  this   Lcom/cecjx/TestM;
Start+Length 表示一個本地變量的做用域(0對應行是15,10對應行是17||即表示在該方法中,該變量的做用範圍是15行到17行)
Slot 表示幾個槽存儲
Name 表示簡單名字

簽名
Signature
僞泛型。
複製代碼

在這裏插入圖片描述

  • 靜態變量初始化
static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: iconst_2
         1: putstatic     #3                  // Field m:I
         4: return
      LineNumberTable:
        line 12: 0
複製代碼

在這裏插入圖片描述

相關文章
相關標籤/搜索