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 各種型案例




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

package com.jvm;
import java.util.Date;
public class ClassTest {
private Date date =new Date();
}
