详解 类的加载

(请观看本人博文 —— 《详解 反射机制》



类加载器

在讲解类加载器之前,本人要先来讲解下一个知识点 —— 类的加载

类的加载:

概述

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

现在,本人就对这三步骤来做下详细的说明
说明

  • 加载
    就是指将class文件读入内存,并为之创建一个Class对象
    任何类被使用时系统都会建立一个Class对象
  • 连接
    验证 : 是否有正确的内部结构,并和其他类协调一致
    准备 : 负责为类的静态成员分配内存,并设置默认初始化值
    解析: 把类中的符号引用转换为直接引用
  • 初始化
    静态变量赋值,执行static代码块
    (注:
  1. static代码块只有jvm能够调用
  2. 如果是多线程需要同时初始化一个类,仅仅只能允许其中一个线程对其执行初始化操作,其 余线程必须等待,只有在活动线程执行完对类的初始化操作之后,才会通知正在等待的其他线程)

因为子类存在对父类的依赖,
所以类的加载顺序是先加载父类后加载子类,初始化也一样。
不过, 父类初始化时,子类静态变量的值也有有的,是默认值。
最终,方法区会存储当前类类信息,
包括类的静态变量、类初始化代码(定义静态变量时的赋值语句 和 静态初始化代码块)、实例变量定义、实例初始化代码(定义实例变量时的赋值语句实例代码块 和 构造方法)和 实例方法,还有父类的类信息引用。

那么,类在什么时候被加载呢?

类的加载时机

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

那么,现在,本人来讲解下 类加载器

类加载器:

概述

负责将.class文件加载到内存中,并为之生成对应的Class对象

类加载器一共分为三类

分类
Bootstrap ClassLoader (根类加载器)
Extension ClassLoader (扩展类加载器)
Sysetm ClassLoader (系统类加载器)

现在,本人来介绍下这三种类加载器的作用

作用

  • Bootstrap ClassLoader (根类加载器):
    也被称为引导类加载器,负责Java核心类的加载
    比如System,String等。在 JDKJRE 的 lib目录rt.jar文件
  • Extension ClassLoader (扩展类加载器):
    负责JRE的扩展目录jar包的加载
    JDKJRE的lib目录ext目录
  • Sysetm ClassLoader(系统类加载器):
    负责在JVM启动时加载来自java命令class文件
    以及classpath环境变量所指定的jar包和类路径

(本人 反射机制 总集篇博文链接:https:////www.cnblogs.com/codderYouzg/p/12419061.html

原文地址:https://www.cnblogs.com/codderYouzg/p/12419073.html