你管這破玩意叫 class?
public class FlashObject {
private String name;
private int age;
public String getName() {
return name;
}
public int add(int a, int b) {
return a + b;
}
}
public class FlashObject{private String name;private int age;public int add(int a,int b){return a+b;}
1 類信息

這里的一個小方格是 1 個字節(jié),也就是 8 位。一個英文字母用 ASCII 碼表示為 1 個字節(jié),所以占一個方格,之后不再解釋。



2 常量池






3 變量

先看標記部分

標記 | 值 |
public | 0x0001 |
private | 0x0002 |
protected | 0x0004 |
static | 0x0008 |
final | 0x0010 |
volatile | 0x0040 |
transient | 0x0080 |

再看類型部分
符號表示 | 類型 |
B | byte |
C | char |
D | double |
F | float |
I | int |
J | long |
S | short |
Z | boolean |
LClassName ; | 類 |
[ | 數組 |

ok,第二部分也搞定了。
再看名字部分



4 方法
public int add(int a, int b) {
return a + b;
}
標記 | 值 |
public | 0x0001 |
private | 0x0002 |
protected | 0x0004 |
static | 0x0008 |
final | 0x0010 |
volatile | 0x0040 |
transient | 0x0080 |
synchronized | 0x0020 |
native | 0x0100 |
abstract | 0x0400 |
符號表示 | 類型 |
B | byte |
C | char |
D | double |
F | float |
I | int |
J | long |
S | short |
Z | boolean |
LClassName ; | 類 |
[ | 數組 |
V | void |

@RequestMapping()
public String function(String a) throws Exception {
return a;
}

public int add(int a, int b) {
return a + b;
}



5 class

FlashObject.class
后記
根據 Java 虛擬機規(guī)范,Java Virtual Machine Specification Java SE 8 Edition,一個 class 文件的標準結構,是這樣的。
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}我們的設計與它幾乎相同。
只有后兩項,我們沒有涉及到,本身也不是重點。
如果想了解 class 文件的全部細節(jié),最好的辦法就是閱讀官方文檔,也就是 Java 虛擬機規(guī)范的第四部分。
Chapter 4. The class File Format
這里的鏈接可以直接定位:
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.3.2
不要覺得官方文檔晦澀難懂,這個部分還是非常清晰明了的,大多數博客基本上對格式的講解都缺斤少兩,而且說得也不形象,還不如直接閱讀官方文檔呢。
還有一個好的方式,就是直接觀察 class 文件的二進制結構解析,這里推薦一個工具
classpy
用這個工具打開一個 class 文件,是這個樣子。

左邊解析好的樹型結構,可以直接和右邊的 class 文件的二進制內容相對應,非常好用。
最后,希望大家找時間用這個工具分析一個復雜的 class 文件,會很有幫助的。祝大家學會 class 文件。
