---
title: ç±»æä»¶ç»æè¯¦è§£
category: Java
tag:
- JVM
---
## å顾ä¸ä¸åèç
å¨ Java ä¸ï¼JVM å¯ä»¥çè§£ç代ç å°±å«å`åèç `ï¼å³æ©å±å为 `.class` çæä»¶ï¼ï¼å®ä¸é¢åä»»ä½ç¹å®çå¤çå¨ï¼åªé¢åèææºãJava è¯è¨éè¿åèç çæ¹å¼ï¼å¨ä¸å®ç¨åº¦ä¸è§£å³äºä¼ ç»è§£éåè¯è¨æ§è¡æçä½çé®é¢ï¼åæ¶åä¿çäºè§£éåè¯è¨å¯ç§»æ¤çç¹ç¹ãæä»¥ Java ç¨åºè¿è¡æ¶æ¯è¾é«æï¼èä¸ï¼ç±äºåèç å¹¶ä¸é对ä¸ç§ç¹å®çæºå¨ï¼å æ¤ï¼Java ç¨åºæ 须鿰ç¼è¯ä¾¿å¯å¨å¤ç§ä¸åæä½ç³»ç»çè®¡ç®æºä¸è¿è¡ã
Clojureï¼Lisp è¯è¨çä¸ç§æ¹è¨ï¼ãGroovyãScalaãJRubyãKotlin çè¯è¨é½æ¯è¿è¡å¨ Java èææºä¹ä¸ãä¸å¾å±ç¤ºäºä¸åçè¯è¨è¢«ä¸åçç¼è¯å¨ç¼è¯æ`.class`æä»¶æç»è¿è¡å¨ Java èææºä¹ä¸ã`.class`æä»¶çäºè¿å¶æ ¼å¼å¯ä»¥ä½¿ç¨ [WinHex](https://www.x-ways.net/winhex/) æ¥çã

å¯ä»¥è¯´`.class`æä»¶æ¯ä¸åçè¯è¨å¨ Java èææºä¹é´çéè¦æ¡¥æ¢ï¼åæ¶ä¹æ¯æ¯æ Java 跨平å°å¾éè¦çä¸ä¸ªåå ã
## Class æä»¶ç»ææ»ç»
æ ¹æ® Java èææºè§èï¼Class æä»¶éè¿ `ClassFile` å®ä¹ï¼æç¹ç±»ä¼¼ C è¯è¨çç»æä½ã
`ClassFile` çç»æå¦ä¸ï¼
```java
ClassFile {
u4 magic; //Class æä»¶çæ å¿
u2 minor_version;//Class çå°çæ¬å·
u2 major_version;//Class çå¤§çæ¬å·
u2 constant_pool_count;//叏鿱 çæ°é
cp_info constant_pool[constant_pool_count-1];//叏鿱
u2 access_flags;//Class çè®¿é®æ è®°
u2 this_class;//å½åç±»
u2 super_class;//ç¶ç±»
u2 interfaces_count;//æ¥å£
u2 interfaces[interfaces_count];//ä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£
u2 fields_count;//Class æä»¶çåæ®µå±æ§
field_info fields[fields_count];//ä¸ä¸ªç±»å¯ä»¥æå¤ä¸ªå段
u2 methods_count;//Class æä»¶çæ¹æ³æ°é
method_info methods[methods_count];//ä¸ä¸ªç±»å¯ä»¥æä¸ªå¤ä¸ªæ¹æ³
u2 attributes_count;//æ¤ç±»ç屿§è¡¨ä¸ç屿§æ°
attribute_info attributes[attributes_count];//屿§è¡¨éå
}
```
éè¿åæ `ClassFile` çå
å®¹ï¼æä»¬ä¾¿å¯ä»¥ç¥é class æä»¶çç»æã

ä¸é¢è¿å¼ 徿¯éè¿ IDEA æä»¶ `jclasslib` æ¥ççï¼ä½ å¯ä»¥æ´ç´è§çå° Class æä»¶ç»æã

ä½¿ç¨ `jclasslib` ä¸å
å¯ä»¥ç´è§å°æ¥çæä¸ªç±»å¯¹åºçåèç æä»¶ï¼è¿å¯ä»¥æ¥çç±»çåºæ¬ä¿¡æ¯ã叏鿱 ãæ¥å£ã屿§ã彿°çä¿¡æ¯ã
ä¸é¢è¯¦ç»ä»ç»ä¸ä¸ Class æä»¶ç»ææ¶åå°çä¸äºç»ä»¶ã
### éæ°ï¼Magic Numberï¼
```java
u4 magic; //Class æä»¶çæ å¿
```
æ¯ä¸ª Class æä»¶ç头 4 个åèç§°ä¸ºéæ°ï¼Magic Numberï¼,å®çå¯ä¸ä½ç¨æ¯**ç¡®å®è¿ä¸ªæä»¶æ¯å¦ä¸ºä¸ä¸ªè½è¢«èææºæ¥æ¶ç Class æä»¶**ã
ç¨åºè®¾è®¡è
å¾å¤æ¶åé½å欢ç¨ä¸äºç¹æ®çæ°å表示åºå®çæä»¶ç±»åæè
å
¶å®ç¹æ®çå«ä¹ã
### Class æä»¶çæ¬å·ï¼Minor&Major Versionï¼
```java
u2 minor_version;//Class çå°çæ¬å·
u2 major_version;//Class çå¤§çæ¬å·
```
ç´§æ¥çéæ°çå个åèåå¨çæ¯ Class æä»¶ççæ¬å·ï¼ç¬¬ 5 å第 6 使¯**æ¬¡çæ¬å·**ï¼ç¬¬ 7 å第 8 使¯**ä¸»çæ¬å·**ã
æ¯å½ Java åå¸å¤§çæ¬ï¼æ¯å¦ Java 8ï¼Java9ï¼çæ¶åï¼ä¸»çæ¬å·é½ä¼å 1ãä½ å¯ä»¥ä½¿ç¨ `javap -v` å½ä»¤æ¥å¿«éæ¥ç Class æä»¶ççæ¬å·ä¿¡æ¯ã
é«çæ¬ç Java èææºå¯ä»¥æ§è¡ä½çæ¬ç¼è¯å¨çæç Class æä»¶ï¼ä½æ¯ä½çæ¬ç Java èææºä¸è½æ§è¡é«çæ¬ç¼è¯å¨çæç Class æä»¶ãæä»¥ï¼æä»¬å¨å®é
å¼åçæ¶åè¦ç¡®ä¿å¼åçç JDK çæ¬åç产ç¯å¢ç JDK çæ¬ä¿æä¸è´ã
### 叏鿱 ï¼Constant Poolï¼
```java
u2 constant_pool_count;//叏鿱 çæ°é
cp_info constant_pool[constant_pool_count-1];//叏鿱
```
ç´§æ¥çä¸»æ¬¡çæ¬å·ä¹åçæ¯å¸¸éæ± ï¼å¸¸éæ± çæ°éæ¯ `constant_pool_count-1`ï¼**叏鿱 计æ°å¨æ¯ä» 1 å¼å§è®¡æ°çï¼å°ç¬¬ 0 项常éç©ºåºæ¥æ¯æç¹æ®èèçï¼ç´¢å¼å¼ä¸º 0 代表âä¸å¼ç¨ä»»ä½ä¸ä¸ªå¸¸éæ± é¡¹â**ï¼ã
叏鿱 主è¦åæ¾ä¸¤å¤§å¸¸éï¼åé¢éå符å·å¼ç¨ãåé¢éæ¯è¾æ¥è¿äº Java è¯è¨å±é¢ççå¸¸éæ¦å¿µï¼å¦ææ¬å符串ã声æä¸º final ç常éå¼çãè符å·å¼ç¨åå±äºç¼è¯åçæ¹é¢çæ¦å¿µãå
æ¬ä¸é¢ä¸ç±»å¸¸éï¼
- ç±»åæ¥å£çå
¨éå®å
- åæ®µçåç§°åæè¿°ç¬¦
- æ¹æ³çåç§°åæè¿°ç¬¦
叏鿱 䏿¯ä¸é¡¹å¸¸é齿¯ä¸ä¸ªè¡¨ï¼è¿ 14 ç§è¡¨æä¸ä¸ªå
±åçç¹ç¹ï¼**å¼å§ç第ä¸ä½æ¯ä¸ä¸ª u1 ç±»åçæ å¿ä½ -tag æ¥æ è¯å¸¸éçç±»åï¼ä»£è¡¨å½åè¿ä¸ªå¸¸éå±äºåªç§å¸¸éç±»åï¼**
| ç±»å | æ å¿ï¼tagï¼ | æè¿° |
| :------------------------------: | :---------: | :--------------------: |
| CONSTANT_utf8_info | 1 | UTF-8 ç¼ç çå符串 |
| CONSTANT_Integer_info | 3 | æ´å½¢åé¢é |
| CONSTANT_Float_info | 4 | æµ®ç¹ååé¢é |
| CONSTANT_Long_info | ï¼ | é¿æ´ååé¢é |
| CONSTANT_Double_info | ï¼ | å精度浮ç¹ååé¢é |
| CONSTANT_Class_info | ï¼ | ç±»ææ¥å£ç符å·å¼ç¨ |
| CONSTANT_String_info | ï¼ | å符串类ååé¢é |
| CONSTANT_FieldRef_info | ï¼ | åæ®µç符å·å¼ç¨ |
| CONSTANT_MethodRef_info | 10 | ç±»ä¸æ¹æ³ç符å·å¼ç¨ |
| CONSTANT_InterfaceMethodRef_info | 11 | æ¥å£ä¸æ¹æ³ç符å·å¼ç¨ |
| CONSTANT_NameAndType_info | 12 | åæ®µææ¹æ³ç符å·å¼ç¨ |
| CONSTANT_MethodType_info | 16 | æ å¿æ¹æ³ç±»å |
| CONSTANT_MethodHandle_info | 15 | è¡¨ç¤ºæ¹æ³å¥æ |
| CONSTANT_InvokeDynamic_info | 18 | 表示ä¸ä¸ªå¨ææ¹æ³è°ç¨ç¹ |
`.class` æä»¶å¯ä»¥éè¿`javap -v classç±»å` æä»¤æ¥çä¸ä¸å
¶å¸¸éæ± ä¸çä¿¡æ¯(`javap -v classç±»å-> temp.txt`ï¼å°ç»æè¾åºå° temp.txt æä»¶)ã
### è®¿é®æ å¿(Access Flags)
```java
u2 access_flags;//Class çè®¿é®æ è®°
```
å¨å¸¸éæ± ç»æä¹åï¼ç´§æ¥çç两个åèä»£è¡¨è®¿é®æ å¿ï¼è¿ä¸ªæ å¿ç¨äºè¯å«ä¸äºç±»æè
æ¥å£å±æ¬¡ç访é®ä¿¡æ¯ï¼å
æ¬ï¼è¿ä¸ª Class æ¯ç±»è¿æ¯æ¥å£ï¼æ¯å¦ä¸º `public` æè
`abstract` ç±»åï¼å¦ææ¯ç±»çè¯æ¯å¦å£°æä¸º `final` ççã
类访é®å屿§ä¿®é¥°ç¬¦:

æä»¬å®ä¹äºä¸ä¸ª `Employee` ç±»
```java
package top.snailclimb.bean;
public class Employee {
...
}
```
éè¿`javap -v classç±»å` æä»¤æ¥çä¸ä¸ç±»çè®¿é®æ å¿ã

### å½åç±»ï¼This Classï¼ãç¶ç±»ï¼Super Classï¼ãæ¥å£ï¼Interfacesï¼ç´¢å¼éå
```java
u2 this_class;//å½åç±»
u2 super_class;//ç¶ç±»
u2 interfaces_count;//æ¥å£
u2 interfaces[interfaces_count];//ä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£
```
Java ç±»çç»§æ¿å
³ç³»ç±ç±»ç´¢å¼ãç¶ç±»ç´¢å¼åæ¥å£ç´¢å¼éåä¸é¡¹ç¡®å®ã类索å¼ãç¶ç±»ç´¢å¼åæ¥å£ç´¢å¼éåæç
§é¡ºåºæå¨è®¿é®æ å¿ä¹åï¼
类索å¼ç¨äºç¡®å®è¿ä¸ªç±»çå
¨éå®åï¼ç¶ç±»ç´¢å¼ç¨äºç¡®å®è¿ä¸ªç±»çç¶ç±»çå
¨éå®åï¼ç±äº Java è¯è¨çåç»§æ¿ï¼æä»¥ç¶ç±»ç´¢å¼åªæä¸ä¸ªï¼é¤äº `java.lang.Object` ä¹å¤ï¼ææç Java ç±»é½æç¶ç±»ï¼å æ¤é¤äº `java.lang.Object` å¤ï¼ææ Java ç±»çç¶ç±»ç´¢å¼é½ä¸ä¸º 0ã
æ¥å£ç´¢å¼éåç¨æ¥æè¿°è¿ä¸ªç±»å®ç°äºé£äºæ¥å£ï¼è¿äºè¢«å®ç°çæ¥å£å°æ `implements` (妿è¿ä¸ªç±»æ¬èº«æ¯æ¥å£çè¯åæ¯`extends`) åçæ¥å£é¡ºåºä»å·¦å°å³æå卿¥å£ç´¢å¼éåä¸ã
### åæ®µè¡¨éåï¼Fieldsï¼
```java
u2 fields_count;//Class æä»¶çåæ®µç个æ°
field_info fields[fields_count];//ä¸ä¸ªç±»ä¼å¯ä»¥æä¸ªå段
```
åæ®µè¡¨ï¼field infoï¼ç¨äºæè¿°æ¥å£æç±»ä¸å£°æçåéãåæ®µå
æ¬ç±»çº§åé以åå®ä¾åéï¼ä½ä¸å
æ¬å¨æ¹æ³å
é¨å£°æçå±é¨åéã
**field info(åæ®µè¡¨) çç»æ:**

- **access_flags:** åæ®µçä½ç¨åï¼`public` ,`private`,`protected`修饰符ï¼ï¼æ¯å®ä¾åéè¿æ¯ç±»åéï¼`static`修饰符ï¼,å¯å¦è¢«åºååï¼transient 修饰符ï¼,å¯åæ§ï¼finalï¼,å¯è§æ§ï¼volatile ä¿®é¥°ç¬¦ï¼æ¯å¦å¼ºå¶ä»ä¸»å
å读åï¼ã
- **name_index:** 坹叏鿱 çå¼ç¨ï¼è¡¨ç¤ºçåæ®µçåç§°ï¼
- **descriptor_index:** 坹叏鿱 çå¼ç¨ï¼è¡¨ç¤ºåæ®µåæ¹æ³çæè¿°ç¬¦ï¼
- **attributes_count:** ä¸ä¸ªå段è¿ä¼æ¥æä¸äºé¢å¤ç屿§ï¼attributes_count 忾屿§ç个æ°ï¼
- **attributes[attributes_count]:** åæ¾å
·ä½å±æ§å
·ä½å
容ã
ä¸è¿°è¿äºä¿¡æ¯ä¸ï¼åä¸ªä¿®é¥°ç¬¦é½æ¯å¸å°å¼ï¼è¦ä¹ææä¸ªä¿®é¥°ç¬¦ï¼è¦ä¹æ²¡æï¼å¾éåä½¿ç¨æ å¿ä½æ¥è¡¨ç¤ºãèåæ®µå«ä»ä¹ååãåæ®µè¢«å®ä¹ä¸ºä»ä¹æ°æ®ç±»åè¿äºé½æ¯æ æ³åºå®çï¼åªè½å¼ç¨å¸¸éæ± ä¸å¸¸éæ¥æè¿°ã
**åæ®µç access_flag çåå¼:**

### æ¹æ³è¡¨éåï¼Methodsï¼
```java
u2 methods_count;//Class æä»¶çæ¹æ³çæ°é
method_info methods[methods_count];//ä¸ä¸ªç±»å¯ä»¥æä¸ªå¤ä¸ªæ¹æ³
```
methods_count è¡¨ç¤ºæ¹æ³çæ°éï¼è method_info è¡¨ç¤ºæ¹æ³è¡¨ã
Class æä»¶å卿 ¼å¼ä¸å¯¹æ¹æ³çæè¿°ä¸å¯¹å段çæè¿°å ä¹éç¨äºå®å
¨ä¸è´çæ¹å¼ãæ¹æ³è¡¨çç»æå¦ååæ®µè¡¨ä¸æ ·ï¼ä¾æ¬¡å
æ¬äºè®¿é®æ å¿ãåç§°ç´¢å¼ãæè¿°ç¬¦ç´¢å¼ã屿§è¡¨éåå 项ã
**method_info(æ¹æ³è¡¨ç) ç»æ:**

**æ¹æ³è¡¨ç access_flag åå¼ï¼**

注æï¼å 为`volatile`修饰符å`transient`修饰符ä¸å¯ä»¥ä¿®é¥°æ¹æ³ï¼æä»¥æ¹æ³è¡¨çè®¿é®æ å¿ä¸æ²¡æè¿ä¸¤ä¸ªå¯¹åºçæ å¿ï¼ä½æ¯å¢å äº`synchronized`ã`native`ã`abstract`çå
³é®åä¿®é¥°æ¹æ³ï¼æä»¥ä¹å°±å¤äºè¿äºå
³é®å对åºçæ å¿ã
### 屿§è¡¨éåï¼Attributesï¼
```java
u2 attributes_count;//æ¤ç±»ç屿§è¡¨ä¸ç屿§æ°
attribute_info attributes[attributes_count];//屿§è¡¨éå
```
å¨ Class æä»¶ï¼åæ®µè¡¨ï¼æ¹æ³è¡¨ä¸é½å¯ä»¥æºå¸¦èªå·±ç屿§è¡¨éåï¼ä»¥ç¨äºæè¿°æäºåºæ¯ä¸æçä¿¡æ¯ãä¸ Class æä»¶ä¸å
¶å®çæ°æ®é¡¹ç®è¦æ±ç顺åºãé¿åº¦åå
容ä¸åï¼å±æ§è¡¨éåçéå¶ç¨å¾®å®½æ¾ä¸äºï¼ä¸åè¦æ±åä¸ªå±æ§è¡¨å
·æä¸¥æ ¼ç顺åºï¼å¹¶ä¸åªè¦ä¸ä¸å·²æç屿§åéå¤ï¼ä»»ä½äººå®ç°çç¼è¯å¨é½å¯ä»¥å屿§è¡¨ä¸å å
¥èªå·±å®ä¹ç屿§ä¿¡æ¯ï¼Java èææºè¿è¡æ¶ä¼å¿½ç¥æå®ä¸è®¤è¯ç屿§ã
## åè
- ã宿 Java èææºã
- Chapter 4. The class File Format - Java Virtual Machine Specification:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
- å®ä¾åæ JAVA CLASS çæä»¶ç»æï¼