详解 类的加载
(请观看本人博文 —— 《详解 反射机制》)
类加载器
在讲解类加载器之前,本人要先来讲解下一个知识点 —— 类的加载:
类的加载:
概述
当程序要使用某个类时,如果该类还未被加载到内存中,
则系统会通过 加载,连接,初始化 三步来实现对这个类进行初始化
现在,本人就对这三步骤来做下详细的说明:
说明:
- 加载:
就是指将class文件读入内存,并为之创建一个Class对象
任何类被使用时系统都会建立一个Class对象- 连接:
验证 : 是否有正确的内部结构,并和其他类协调一致
准备 : 负责为类的静态成员分配内存,并设置默认初始化值
解析: 把类中的符号引用转换为直接引用- 初始化:
为静态变量赋值,执行static代码块
(注:
- static代码块只有jvm能够调用
- 如果是多线程需要同时初始化一个类,仅仅只能允许其中一个线程对其执行初始化操作,其 余线程必须等待,只有在活动线程执行完对类的初始化操作之后,才会通知正在等待的其他线程)
因为子类存在对父类的依赖,
所以类的加载顺序是先加载父类后加载子类,初始化也一样。
不过, 父类初始化时,子类静态变量的值也有有的,是默认值。
最终,方法区会存储当前类类信息,
包括类的静态变量、类初始化代码(定义静态变量时的赋值语句 和 静态初始化代码块)、实例变量定义、实例初始化代码(定义实例变量时的赋值语句实例代码块 和 构造方法)和 实例方法,还有父类的类信息引用。
那么,类在什么时候被加载呢?
类的加载时机:
- 创建类的实例
- 访问类的静态变量,或者为静态变量赋值
- 调用类的静态方法
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
那么,现在,本人来讲解下 类加载器:
类加载器:
概述:
负责将.class文件加载到内存中,并为之生成对应的Class对象
类加载器一共分为三类:
分类:
Bootstrap ClassLoader (根类加载器)
Extension ClassLoader (扩展类加载器)
Sysetm ClassLoader (系统类加载器)
现在,本人来介绍下这三种类加载器的作用:
作用
- Bootstrap ClassLoader (根类加载器):
也被称为引导类加载器,负责Java核心类的加载
比如System,String等。在 JDK 中 JRE 的 lib目录 下 rt.jar文件 中- Extension ClassLoader (扩展类加载器):
负责JRE的扩展目录中jar包的加载
在 JDK 中 JRE的lib目录 下 ext目录- Sysetm ClassLoader(系统类加载器):
负责在JVM启动时加载来自java命令的class文件
以及classpath环境变量所指定的jar包和类路径
(本人 反射机制 总集篇博文链接:https:////www.cnblogs.com/codderYouzg/p/12419061.html)