(给ImportNew加星标,提高Java技能)
我是一个 .java 文件,名叫 FlashObject.java,叫我小渣就行。
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 个字节,也就是 8 位。一个英文字母用 ASCII 码表示为 1 个字节,所以占一个方格,之后不再解释。
标记
值
public
0x0001
private
0x0002
protected
0x0004
static
0x0008
final
0x0010
volatile
0x0040
transient
0x0080
复合型的标记,就可以表现为将其相加,比如 public static,就是 0x0001 + 0x0008 = 0x0009。符号表示
类型
B
byte
C
char
D
double
F
float
I
int
J
long
S
short
Z
boolean
LClassName ;
类
[
数组
这 里的基本数据类型,和数组类型 ,都只占用一个 char 来表示,就只占了 1 个字节。ok,第二部分也搞定了。
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;
}
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 文件。
- EOF -
1、基于 token 的多平台身份认证架构设计
2、为什么数据库字段要使用NOT NULL?
3、好家伙,你管这破玩意叫文件系统?
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
点赞和在看就是最大的支持❤️