Java类加载器classLoader的工作机制
- - CSDN博客推荐文章类加载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件. 在Java中,类转载器把一个类装入JVM中,需要经过以下步骤:. 1.装载:查找和导入Class文件. 2.链接: 执行校验、准备和解析步骤,其中解析步骤是可以选择的:. a)校验: 检查载入Class文件数据的正确性;. b)准备:给类的静态变量分配存储空间;.
类加载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。在Java中,类转载器把一个类装入JVM中,需要经过以下步骤:
1.装载:查找和导入Class文件。
2.链接: 执行校验、准备和解析步骤,其中解析步骤是可以选择的:
a)校验: 检查载入Class文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
c)解析:将符号引用变成直接引用。
类装载工作是由ClassLoader及其之类负责的,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节文件。JVM在运行时会产生三个ClassLoader:跟装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。其中,跟装载器不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它,跟装载器负责装载JRE的核心类库,如rt.jar,charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载ClassPath路径下的类包。
这三个类装载器之间存在父子层级关系,跟装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。默认情况下,使用AppClassLoader装载应用程序的类,我们可以试验如下:
package com.uestc.test; public class ClassLoaderTest { public static void main(String[] args) { ClassLoader c=Thread.currentThread().getContextClassLoader(); System.out.println(c); System.out.println(c.getParent()); System.out.println(c.getParent().getParent()); } }
sun.misc.Launcher$AppClassLoader@1016632 sun.misc.Launcher$ExtClassLoader@dc6a77 null从上述结果可以分析得出当前的ClassLoader是AppClassloader,父ClassLoader是ExtClassLoader,祖父ClassLoader是根类装载器,因为在Java中无法获得它的句柄,因此返回null。