你管这破玩意叫 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 个字节,也就是 8 位。一个英文字母用 ASCII 码表示为 1 个字节,所以占一个方格,之后不再解释。



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 虚拟机规范,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 文件的全部细节,最好的办法就是阅读官方文档,也就是 Java 虚拟机规范的第四部分。
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 文件。
