Class文件結構

1、文件結構

1.1 例圖:

輸入圖片說明

1.2 結構圖形

輸入圖片說明

  • 說明:
符號 中文名 結構 做用 規則
magic 魔數 U4 全部的由Java編譯器編譯而成的class文件的前4個字節都是 「0xCAFEBABE」 ,JVM用來判斷是不是可加載的.class文件
minor_version 次版本號 u2 JVM
major_version 主版本號 u2 JVM加載class文件的時候,判斷是否可加載,若是JDK.Mj_Version<Class.Mj_Version,則認爲加載不了。須要從新編譯 JDK1.0->45;1.7->51
constant_pool_count 常量池中常量數量 u2 記錄了constatn_pool中constant_pool_info的數量 index從1開始;index=0:某些指向常量池的索引值的數據在特定的狀況下表達「不引用任何一個常量池項」
constatn_pool 常量池數據區 constant_pool_info結構 包含Class文件結構及其子結構中引用的全部 字符串常量、類、接口、字段名和其它常量(字面量和符號引用) tag bytes:第一個字節,用於識別哪一種類型的常量。index=constant_pool_count - 1
access_flags 訪問標誌 u2 表示某個類或者接口的訪問權限及基礎屬性
this_class 類索引 u2 this_class的值必須是對constant_pool表中項目的一個有效索引值。constant_pool表在這個索引處的項必須爲CONSTANT_Class_info 類型常量,表示這個 Class 文件所定義的類或接口
super_class 父類索引 u2 super_class的值必須是對constant_pool表中項目的一個有效索引值。constant_pool表在這個索引處的項必須爲CONSTANT_Class_info 類型常量,表示這個 Class 文件所定義的直接父類
interfaces_count 接口計數器 u2 當前類或接口的直接父類接口數
interfaces 接口信息數據區(接口表) u2 interfaces[]數組中的每一個成員的值必須是一個對constant_pool表中項目的一個有效索引值, 它的長度爲 interfaces_count
fields_count 字段計數區 u2 fields_count的值表示當前Class文件 fields[] 數組的成員個數
fields 字段信息數據區(字段表) field_info結構 fields[]數組中的每一個成員都必須是一個fields_info結構 的數據項,用於表示當前類或接口某個字段的完整描述,但不包括從父類或父接口繼承的部分
methods_count 方法計數器 u2 methods_count的值表示當前Class 文件 methods[]數組的成員個數
methods 方法信息數據區(方法表) method_info 結構 methods[] 數組中的每一個成員都必須是一個 method_info 結構 的數據項,用於表示當前類或接口中某個方法的完整描述
attributions_count 屬性計數器 u2 attributes_count的值表示當前 Class 文件attributes表的成員個數
attributions 屬性信息數據區(屬性表) attribute_info結構 attributes 表的每一個項的值必須是attribute_info結構 在Java 7 規範裏,Class文件結構中的attributes表的項包括下列定義的屬性InnerClasses 、 EnclosingMethod 、 Synthetic 、Signature、SourceFile,SourceDebugExtension 、Deprecated、RuntimeVisibleAnnotations 、RuntimeInvisibleAnnotations以及BootstrapMethods屬性
  • u四、u二、u1表示幾個字節
  • cp_info(Constant_pool_info):常量池中,字符表的數據結構
  • field_info:字段表中數據結構
  • method_info:方法表中的數據結構
  • attribute_info:屬性表中的數據結構
1.3 class文件:access_flags:

輸入圖片說明

2、class文件常量池

2.1 常量池總結
  • 全部 符號(變量、方法、類) 都是經過cp_info結構來表示
  • 同一文件的全部符號(變量、方法、類) 的相同值都會指向同一地址
  • 對全部的基本類型(int、float、long、double) 都是 字面類型+bytes表示
  • 對全部引用類型(String,class),都會用單獨的 Constant_utf8_info 構造,而後在經過 Constant_String_info, constant_Class_info 指針只過去
    • 每一個個類而言,其class文件中至少要有兩個CONSTANT_Class_info常量池項,用來表示本身的類信息和其父類(Object)信息
2.2 class文件的常量池結構

輸入圖片說明

2.3 class文件常量池中數據結構

輸入圖片說明

2.4 cp_info的字面量

輸入圖片說明

2.5 cp_info表示信息

輸入圖片說明

2.6 各種型案例
  • int、float型

輸入圖片說明

  • long、double型

輸入圖片說明

  • String型引用

輸入圖片說明

  • String型具體數據

輸入圖片說明

public class StringTest {  
    private String s1 = "JVM原理";  
    private String s2 = "JVM原理";  
    private String s3 = "JVM原理";  
    private String s4 = "JVM原理";  
}

輸入圖片說明

  • class引用
    • 先用 javap -v 反編譯
package com.jvm;  
import  java.util.Date;  
public class ClassTest {  
    private Date date =new Date();  
}

輸入圖片說明

相關文章
相關標籤/搜索