你管这破玩意叫 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 文件。