java源代码编译过程
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
A class file consists of a single ClassFile structure:
以下就是后缀为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];
}
java的源文件经过javac的编译以后就会编译为后缀为.class 16进制的文件。
编译后的class文件:都是以cafa babe开头

图解:

类加载机制的过程
在官方文档中我们就可以看出: Loading, Linking, and Initializing
分别是:Loading(装载)、Linking(链接)、Initializing(初始化)
- 装载
查找class文件:Java面向对象(ClassLoader.loadclass,findclass)
-
- 类的全限定路径名转换为二进制
- 二进制流数据:类的描述信息的数据time/author。存储方法区
- class<Person>对象,存储Person对象在堆中。java.lang.class
- 链接
- 验证:
- 保证被加载类的正确性:元数据、文件、字节码
- 验证:
-
- 为类的静态资源分配内存空间,初始化默认值

-
- 解析:把类的符号引用转换为直接引用
- 符号引用:class文件中定义的那些内容
- 直接引用:java进程中的一些具体的真实地址、指针、句柄
- 解析:把类的符号引用转换为直接引用
- 初始化:对类 的静态变量初始化

来源:https://www.cnblogs.com/LBJLAKERS/p/12273967.html