类加载过程和双亲委派模型
类加载过程
加载-->链接【验证、准备、解析】-->初始化-->使用-->卸载【GC】
- 加载:将字节码文件加载到jvm内存中
- 验证:验证字节码文件的格式、符号等的正确性
- 准备:给一些static变量分配内存,设置初始值【0或null】
【不包含final修饰的变量】 - 解析:将常量池中的符号引用替换为直接引用的过程.直接引用为直接指向目标的指针或者相对偏移量等.
- 初始化:主要完成静态块执行以及静态变量的赋值.先初始化父类,再初始化当前类.只有对类主动使用时才会初始化.
触发条件包括,创建类的实例时,访问类的静态方法或静态变量的时候,使用Class.forName反射类的时候,或者某个子类初始化的时候.
Java自带的加载器加载的类,在虚拟机的生命周期中是不会被卸载的,只有用户自定义的加载器加载的类才可以被卸.
双亲委派模型

说明
- 双亲委派的实质是向上委派和向下查找的配合。
- 3个类加载器是jdk自带的类加载器,从上往下依次为父子关系。
- 3个类加载器都有严格的类加载路径,不会随便加载。
- 引导类加载器主要加载 jdk中rt.jar
- 扩展类加载器主要加载ext包下的类
- 系统类加载器主要加载自己写项目下的代码
代码演示
// 获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
// 获取扩展类加载器
ClassLoader extClassLoad = systemClassLoader.getParent();
// 获取引导类加载器
ClassLoader bootClassLoad = extClassLoad.getParent();
System.out.println("系统类加载器:"+systemClassLoader);
System.out.println("扩展类加载器:"+extClassLoad);
System.out.println("引导类加载器:"+bootClassLoad);
}

作用
- 避免类被重复加载
- 避免jdk的核心api被篡改
本文来自博客园,作者:半吊子喵,转载请注明原文链接:https://www.cnblogs.com/johnxh/articles/19086319

浙公网安备 33010602011771号