你管这破玩意叫 class?
共 7793字,需浏览 16分钟
· 2021-03-14
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 类信息
![](https://filescdn.proginn.com/5c873f5b355cb6c38d13b1bd866336d5/f8709795d884987b5f06e5c02c9f542b.webp)
这里的一个小方格是 1 个字节,也就是 8 位。一个英文字母用 ASCII 码表示为 1 个字节,所以占一个方格,之后不再解释。
![](https://filescdn.proginn.com/922c289ad015d7656e65b7a6fca3703f/ff9851d9d35d6b4da698f71f29a09d27.webp)
![](https://filescdn.proginn.com/c6acc9996ee20bbc2eac8abfdf7bf7da/8ce2dce39b4298643cdfb2e4060c927c.webp)
![](https://filescdn.proginn.com/b523aeab7c47aa834cd26f596fd6a1cd/dee082969e52e4d5afb17aae4166dd86.webp)
2 常量池
![](https://filescdn.proginn.com/6608756f14ecaea12675a0f47da6b58d/071de18ad8f98f50559f762926257e05.webp)
![](https://filescdn.proginn.com/0dbb09125f7751f216ad67b7eb3c4d7f/09c0b8eb64a8e8183adc82b5859a062a.webp)
![](https://filescdn.proginn.com/aee0d20e00a53ba20f03a4a93779619a/6db358595f1a9a725641ca91165ad193.webp)
![](https://filescdn.proginn.com/3b04b836f210b848129fdbc7ae22acbd/5f54839b1bcdf97de0937fc7eb62e909.webp)
![](https://filescdn.proginn.com/5ec13e2e21b0928dbb26da6cba887bf8/cee6b49c6fcf0175ae418c445346581a.webp)
![](https://filescdn.proginn.com/f85aa9c5fd7c549c67b472ea5bdafbbb/2392ac5063ce4bcb2a78a67e0cb30784.webp)
3 变量
![](https://filescdn.proginn.com/88a1e4262f219eb31c0d429f800ff8e3/ee48f606921d00db4a71e13fcca6b516.webp)
先看标记部分
![](https://filescdn.proginn.com/f1be249f71dea79c521a1d144b202a7f/32e94fb34a32ae2af84a4cd5c3ea5c8f.webp)
标记 | 值 |
public | 0x0001 |
private | 0x0002 |
protected | 0x0004 |
static | 0x0008 |
final | 0x0010 |
volatile | 0x0040 |
transient | 0x0080 |
![](https://filescdn.proginn.com/d963bca46a1ad0c631563518a7721719/86633a3c92d0c4792970f613bafc7635.webp)
再看类型部分
符号表示 | 类型 |
B | byte |
C | char |
D | double |
F | float |
I | int |
J | long |
S | short |
Z | boolean |
LClassName ; | 类 |
[ | 数组 |
![](https://filescdn.proginn.com/99687d5c6a5a1bfc69a7c24bc39c2668/f8191bee5f2b2a5beb5da464e06488ae.webp)
ok,第二部分也搞定了。
再看名字部分
![](https://filescdn.proginn.com/f64ee22bbbc91ee911baf76850a3ca00/82cbf631062ca189fcc193a96900739e.webp)
![](https://filescdn.proginn.com/f899c2f5c5a84509e2fde7fdfd5f70f0/5da176df56914e6414d790e4811959f8.webp)
![](https://filescdn.proginn.com/8c86ba7195feabaec1f36ae71cbc8d46/774102442906fc27ebb6e9a942bbc80a.webp)
4 方法
public int add(int a, int b) {
return a + b;
}
![](https://filescdn.proginn.com/8902394e64bbbf58e338ecc7edb5ff83/fbb75b7c79d471eff6f3e14fe36830b1.webp)
标记 | 值 |
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;
}
![](https://filescdn.proginn.com/e9d2d3cff86a6a8cd4f88a98950acc68/6b30192a88c44af70ae26bf7d0bdd897.webp)
public int add(int a, int b) {
return a + b;
}
![](https://filescdn.proginn.com/744dc69b7223c223881b10be9b2b8edd/50774fa0e51b2127ccca4a1d7e82abdd.webp)
![](https://filescdn.proginn.com/96f44997ffb8af29b2348fe342317973/c5ab7e9dbaba0bffeb3330feba372dab.webp)
![](https://filescdn.proginn.com/44046b3900fa67510f9ff1c91c3aabae/7a7880c2b23f83cc4394202a5d701fce.webp)
5 class
![](https://filescdn.proginn.com/c4e794b0ff7361f583c7ac288466f4e6/42bb042faa876da07387d89e56e69712.webp)
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 文件。