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