java基础-类加载器

java基础-类加载器

一. 概述

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化

类的加载

  • 将class文件读入到内存中,创建一个java.lang.Class对象
  • 任何类被使用时,系统都会建立一个java.lang.Class对象

类的连接

  • 验证阶段: 用于检验被加载的类是否有正确的内部结构,并和其他类协调一致
  • 准备阶段: 负责为类的变量分配内存,并设置默认初始化值
  • 解析阶段: 将类的二进制数据中的符号引用替换为直接引用

类的初始化

  • 在该阶段,主要对类变量初始化
    • 假如类还未被加载和连接,则先加载并连接该类
    • 假如直接父类未被初始化,则先初始化其父类
    • 假如类中有初始化语句,系统依次执行初始化语句

二. 类加载机制

  • 全盘负责: 当一个类加载器负责加载某个Class时,该类class所依赖的和引用的其他Class也由该类加载器去加载
  • 父类委托: 当加载一个类时,先让父类加载器加载该类,只有父类加载器无法加载该类时才尝试从自己的类路径中加载该类
  • 缓存机制: 当程序使用某个Class对象时,先从缓存中搜索,如果搜索不到,才会读取Class二进制数据,并将其转换成Class对象,存在缓冲区

ClassLoader: 是负责加载类的对象

Bootstrap class loader: 虚拟机的内置类加载器,通常表示为null,内加载器的祖宗

Platform class loader : 可以看到所有平台类,包括平台类加载器或其定义的javaSE平台API,其实现类和JDK特定的运行类

System class loader : 应用程序类加载器,用于定义程序类路径,模块路径和JDK特定工具上的类

System 继承自 Platform 继承自 Bootstrap

三.代码

public class ClassLoaderDemo {
    public static void main(String[] args) {
        ClassLoader c = ClassLoader.getSystemClassLoader();
        System.out.println(c);
        ClassLoader c1 = c.getParent();
        System.out.println(c1);
        ClassLoader c2 = c1.getParent();
        System.out.println(c2);
    }
}
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@4554617c
null

猜你喜欢

转载自blog.csdn.net/QiyunJzz/article/details/108338841
今日推荐