文章目录

  • 一、类加载器概述
  • 二、加载器的过程
  • 三、类加载器的分类
  • 四、双亲委派模型
  • 六、ClassLoader中的两个方法



一、类加载器概述

负责将.class文件加载到内存中

java默认使用系统类加载器 java 系统类加载器_class


类加载的时机

  • 创建类的实例
  • 调用类的类方法
  • 访问类或者接口的类变量,或者为该类变量赋值
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类

二、加载器的过程

  1. 加载
  2. java默认使用系统类加载器 java 系统类加载器_类加载器_02

  3. 链接
  1. 验证
  2. java默认使用系统类加载器 java 系统类加载器_后端_03

  3. 准备
  4. java默认使用系统类加载器 java 系统类加载器_class_04

  5. 解析
  6. java默认使用系统类加载器 java 系统类加载器_java默认使用系统类加载器_05

  1. 初始化
  2. java默认使用系统类加载器 java 系统类加载器_java默认使用系统类加载器_06

当一个类被使用的时候,才会加载到内存。

三、类加载器的分类

  • Bootstrap class loader:启动类加载器,是虚拟机的内置类加载器,通常表示为null ,并且没有父null。
  • Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块,其父加载器为Bootstrap class loader。
  • System class loader:系统类加载器,负责加载用户类路径上所指定的类库,其父加载器为Platform class loader。

四、双亲委派模型

如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。

java默认使用系统类加载器 java 系统类加载器_后端_07

六、ClassLoader中的两个方法

方法名

说明

public static ClassLoader getSystemClassLoader()

获取系统类加载器

public InputStream getResourceAsStream(String name)

加载某一个资源文件

需求:

  • 利用加载器去加载一个指定的文件

prop.properties文件信息

value=csdn

测试类ClassLoaderDemo

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ClassLoaderDemo {
    public static void main(String[] args) throws IOException {
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

        InputStream is = systemClassLoader.getResourceAsStream("prop.properties");

        Properties prop = new Properties();
        prop.load(is);

        System.out.println(prop);

        is.close();
    }
}