类加载的过程是在jvm之外实现的,加载就是把类的二进制.class文件加载到内存中,这个动作是用类加载器实现的。
类加载器一种是虚拟机的一部分的启动类加载器 Bootstrap ClassLoader,一种是其他的类加载器,这些加载器类是继承抽象类
java.lang.ClassLoader。
一般类加载器分为四类
1.根类加载器(BootStrap ClassLoader
类加载器负责将JAVA_HOME下的lib目录下的jar包文件加载虚拟机内存中。启动类的加载器无法被java程序直接引用,
用户在编写自定义类加载器时,如果需要把类加载的请求委派为启动类加载器,直接使用null。
2.扩展类加载器(Extension ClassLoader)
这个类的加载器是由sun.misc.Launcher$ExtClassLoader实现,它负责JAVA_HOME下的lib\ext目录中的类库。
3.应用类加载器或者叫系统类加载器(Application ClassLoader)
这个类加载器是由sun.misc.Lanuncher$AppClassLoader实现。它负责加载用户类路径(ClASS_PATH)上所指定的类库,
开发者可以直接使用这个类加载器,如果用户没有自定义类加载器,一般情况下就是默认的类加载器
4.自定义加载器
如果一个类加载器需要接收到类加载的请求,它首先不会加载这个类,他会把类的加载请求交给父加载器去完成,每一个
层级类加载器都是如此。只有父加载器无法完成类加载的请求,子加载器才会尝试去加载。
这样做的好处路径相同的类不会重复加载到内存中,比如java.lang.Object
原文:https://www.cnblogs.com/JuncaiF/p/12153580.html