负责加载class文件,class文件在文件开头有棒定的文件标示, 将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定
echo %JAVA_HOME%
echo %PATH%
echo %CLASSPATH%
类加载器分为两种,一种是虚拟机自带的类加载器,另一种是自定义的类加载器。我们通常不会自定义类加载器,而是使用java自带的类加载器,但是在框架、服务器中,由于一些特殊的应用方式,会在java自定义类加载器的基础上再增加一些自定义类加载器
Jvm自带三种类加载器,分别是BootstrapClassLoader,ExtClassLoader,AppClassLoader。
启动类加载器
**根加载器BootstrapClassLoader(启动类加载器)**负责加载由系统属性sun.boot.class.path指定目录下的核心类库,也就是我们%JAVA_HOME%\jre\lib目录。它只加载java、javax、sun开头的类
我们都知道Obejct就是java包下的一个类,所以我们可以尝试看看Obejct的类加载器是什么
System.out.println(Object.class.getClassLoader());
//Output:
//null
执行上面的语句会发现返回结果为null,为什么是null,其实是因为我们的根类加载器的编写语言是C++,VM不能够也不允许程序员获取该类,所以返回值用null替代
拓展类加载器(ExtClassLoader)
扩展加载器ExtClassLoader,他的父加载器为根加载器,他从java.ext.dirs(加载<JAVA_HOME>/lib/ext目录中的类库)系统属性所指定的目录中加载类库。是用java编写的,继承java.lang.ClassLoader类。
该类的父加载器是启动类加载器,这里的父子关系并非java中的继承关系
系统类加载器(应用类加载器)
public class test {
public static void main(String[] args) {
System.out.println(test.class.getClassLoader());
}
}
//Output:
//sun.misc.Launcher$AppClassLoader@dad5dc
系统类加载器AppClassLoader,也称为应用类加载器,它的父加载器是扩展加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,继承java.lang.ClassLoader类。
上面例子中的test就是我们的自定义类,并放在我们的classpath路径下,我们可以看到这个类的类加载器返回的是AppClassLoader
自定义加载器
用户自定义加载器,java.lang.ClassLoader的子类,用户可以定制类的加载方式