类的加载器是将.class文件,加载到内存(JVM)中,并生成java.lang.class对象。
加载到JVM中的类都有一个唯一的标识,用其包名和类名作为其标识(java.lang.String就相当于一个标识)。
JVM在运行时会产生3个类加载器组成的初始化加载器层次结构
App/System ClassLoader
系统(应用)类加载器:负责java –classpath 或 –D java.class.path所指的目录下的类与jar包装入工作 ,是最常用的加载器
可以通过ClassLoader的静态方法getSystemLoader()来获取系统类的加载器。如果没有特别指定,则用户自定义的类的加载器都以此类加载器作为父类。
Extension ClassLoader
扩展类加载器:负责jre/lib/ext目录下的jar包或 –D java.ext.dirs 指定目录下的jar包装入工作库
Bootstrap ClassLoader
引导类加载器:用C++编写的,是JVM自带的类加载器,负责Java平台核心库,用来加载核心类库。该加载器无法直接获取
从 系统类加载器 到 扩展类加载器 到 引导类加载器,检查是否已加载,反之尝试加载类。
JVM的根加载器并不是由java实现的,所以无法通过程序获取跟加载器Bootstrap ClassLoader
类加载器加载Class大致要经过几个步骤
- 检测此Class是否载入过(及在缓存区中知否由此Class),如果有则直接最后一步。
- 如果父类加载器存在,则是直接使用父类在加载器去加载目标类,否则直接使用根加载器去加载载入目标类。如果能找到目标类的文件则直接加载成功,否则抛出ClassNotFoundException异常。
- 返回对应的java.lang.Class类对象。