java的class類文件結構

利用五一小假期,看了一下java的類class文件結構,在此記錄一下學習筆記。java

 

字節碼併發

程序的存儲格式。語言無關。學習

跨平臺。翻譯

class文件 — 概述對象

  • 包含了Java虛擬機指令集符號表,以及若干其餘輔助信息。
  • class文件是一組以8位字節爲基礎單位的二進制流。大端方式存儲。

class文件 — 結構繼承

  1. 魔數、class文件的版本
    魔數:肯定這個文件能被虛擬機接受。4個字節:0xCAFEBABE
    版本:緊接着魔數後面。4個字節。
              第五、6個字節標識次版本號。
              第七、8個字節標識主版本號。
     
  2. 常量池
    緊接着版本號,資源倉庫。
    主要存放兩大類常量:字面量(文本字符串、聲明爲final的常量值等)、符號引用。
    java代碼javac編譯,在虛擬機加載class文件時動態連接。
    當虛擬機運行時,須要從常量池獲取對應的符號引用,再在類建立或運行時解析、翻譯到具體的內存地址中。
    Java中若是定義超過64KB英文字符的變量或方法名,將沒法解析。
     
  3. 訪問標誌
    用於識別一些類或接口層次的訪問信息。
    好比public、final等。
     
  4. 類索引、父類索引、接口索引集合
    用這三項數據來肯定這個類的繼承關係。
    類索引:肯定這個類的全限定名。
    父類索引:用於肯定這個類的父類的全限定名。
    接口索引集合:用來描述這個類實現了哪些接口。
     
  5. 字段表集合
    用於描述接口或者類中聲明的變量。
    包括的信息:字段的做用域、實例變量仍是類變量、可變性、併發可見性、能否被序列化、字段數據類型、字段名稱。
     
  6. 方法表集合
    對方法的描述,相似字段表集合。
    方法裏的java代碼,存儲在「Code」屬性裏。
    Java中,要重載一個方法,要求必須擁有一個與原方法不一樣的特徵簽名。
     
  7. 屬性表集合
    在class文件、字段表、方法表中,均可以攜帶本身的屬性表集合,以用於描述某些場景專有的信息。

字節碼指令簡介索引

由一個字節長度的、表明着某種特定操做含義的數字、以及跟隨其後的0至多個表明此操做所需參數構成。接口

  1. 字節碼
    大部分的指令都沒有支持byte、char、short,甚至徹底沒有boolean類型。編譯器會在編譯期或運行期將byte、short類型的數據帶符號擴展爲相應的int類型數據,將boolean和char類型數據零位擴展爲相應的int類型數據。

    大多數對於boolean、byte、short、char類型數據的操做,實際上都是使用相應的int類型做爲運算類型。
     
  2. 加載和存儲指令
    用於將數據在棧幀中的局部變量表和操做數棧之間來回傳輸。
     
  3. 運算指令
    用於對兩個操做數棧上的值進行某種特定的運算,並把結果從新存入到操做棧頂。
    分爲兩種:對整型數據進行運算的指令、對浮點型數據運算的指令。
    舍入操做:向最接近數舍入模式。
     
  4. 類型轉換指令
    將兩種不一樣的數值類型相互轉換。
    寬化類型轉換、窄化類型轉換。
     
  5. 對象建立與訪問指令
    new、newarray、getfield、putfield、baload、bastore、arraylength、instanceof等等。
     
  6. 操做數棧管理指令
    pop、dup、swap等等。
     
  7. 控制轉移指令
    在有條件或無條件地修改PC寄存器的值。
     
  8. 方法調用和返回指令
    invokevirtual、invokeinterface、invokespecial、invokestatic、invokedynamic等
     
  9. 異常處理指令
    顯示拋出異常:athrow;
    虛擬機檢測到異常字段拋出:如ArithmeticException。
     
  10. 同步指令
    使用管程來實現。

 

初步看完,有的地方仍是有點難理解,並且感受過段時間就會忘記。惟有往後不斷思考、複習來加深印象。內存

相關文章
相關標籤/搜索