类加载机制过程

java源代码编译过程

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

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进程中的一些具体的真实地址、指针、句柄
  • 初始化:对类 的静态变量初始化