ClassLoader类的加载过程

类加载器

负责将生成的.class文件加载到内存中,并生成对应的Class对象
类加载器的最终产物就是堆内存中的class对象
三种类加载器:
    BootStrapClassLoader:引导类加载器,负责java核心类的加载
    ExtensionClassLoader: 扩展类加载器
    AppClassLoader:应用类加载器    负责加载我们写的一些类

类加载过程
这里写图片描述

当程序要使用某个类的时候,如果该类还没有被加载到内存中,
系统会通过加载、连接和初始化三步来实现对该类的初始化。

加载:

将class文件中的二进制数据数据读入到内存中,
然后将该字节流所代表的静态存储结构转换为方法区中运行的数据结构,
最终创建一个Class对象,任何类使用时系统都会创建该类的Class对象

连接:

    验证:确保class文件中字节流包含的信息符合当前虚拟机的要求
        文件格式的验证:验证是否符合Class文件格式的规范
        元数据的验证:对字节码描述的信息进行语法校验
        字节码验证:验证程序的控制流程
        符号引用验证:发生在虚拟机将二进制符号转换为直接引用的时候 
    准备:为类变量分配内存并设置初始值。
        这些变量使用的内存都在方法区中分配这时候分配的内存仅包括
        类变量(静态变量),实例变量会在对象实例化的时候        
        随着对象一起分配在堆内存中
    解析:将二进制符号的引用替换为直接引用

初始化:

    父类静态(静态的成员变量,静态代码块),
    子类静态(子类静态成员变量,子类的静态代码块)
    父类非静态(非静态成员变量,构造代码块,构造函数)
    子类非静态(子类非静态成员变量,子类构造代码块,子类构造函数)

静态语句块只能访问定义到静态语句块之前的变量,定义在之后的变量,只能够赋值,不能够访问

static{
    num = 100;
    System.out.println(num);//编译不通过
}
private static int num = 10;

类加载器的加载机制:

双亲委托机制
当一个类加载器调用loadClass之后,并不会直接加载,
而是先交给当前类加载器的父加载器加载,直到最顶层的父加载器。
只有当父加载器无法完成加载的时候,子加载器才会尝试自己加载。
破坏双亲委托机制:实现热部署

猜你喜欢

转载自blog.csdn.net/qq_27046951/article/details/82024214