类加载器指的是Java虚拟机(JVM)中负责加载类文件的模块。它的作用是将类的字节码读取到内存,并转换成JVM可以使用的格式。
类加载器主要有以下几种类型:
- 启动类加载器(Bootstrap ClassLoader):这是虚拟机自身的类加载器,负责加载JVM运行时环境所需的类库,如rt.jar等。它是C/C++实现的,因此在Java中无法直接获取到。
- 扩展类加载器(Extension ClassLoader):这个类加载器用来加载Java的扩展库,如$JAVA_HOME/lib/ext目录下的jar包。它是由Java编写的,在java.lang.ClassLoader的直接子类。
- 应用程序类加载器(Application ClassLoader):也称为系统类加载器,负责加载应用程序classpath下的类库。它是由Java编写的,在java.lang.ClassLoader的直接子类。
- 自定义类加载器(Custom ClassLoader):可以根据需求自定义的类加载器,继承自java.lang.ClassLoader。通过这种方式,可以实现一些特殊需求,如加载加密的类文件、从网络上动态下载类等。
类加载器之间的关系是父子关系,每个类加载器都有一个父加载器(除了启动类加载器)。子加载器可以使用父加载器的资源,但父加载器无法使用子加载器的资源。
什么是双亲委派模型?
当一个类需要加载时,类加载器会根据一定的加载规则进行类加载工作。一般情况下,类加载器会先委托父加载器来尝试加载类,只有当父加载器无法加载时,才由子加载器尝试加载。这种机制被称为"双亲委派模型"。这种模型保证了类的加载是从上到下的,避免了重复加载和类的版本冲突问题。
JVM为什么使用双亲委派机制?
避免类的重复加载:当一个类需要被加载时,JVM首先会委派给父类加载器进行加载,只有当父类加载器无法加载该类时,才会由当前类加载器进行加载。这样可以有效避免类的重复加载,节省了内存空间。
确保类的安全性:通过双亲委派机制,JVM可以对类加载的层次结构进行管理和控制,从而确保类的安全性。只有由受信任的类加载器加载的类才能被使用,防止恶意类的加载和执行。
提高代码的稳定性和可靠性:通过双亲委派机制,JVM可以保证核心类库的一致性和稳定性。当核心类库中的类被加载时,始终使用同一个类加载器进行加载,避免了不同类加载器加载同一个类的情况,从而保证了代码的稳定性和可靠性。
支持类加载的定制化:通过自定义类加载器可以实现对类加载的定制化,根据不同的需求加载不同的类。双亲委派机制使得自定义类加载器可以在委派链的某个节点进行加载,从而实现对加载过程的控制和定制。
总的来说,JVM使用双亲委派机制主要是为了提高类加载的效率、确保类的安全性和支持类加载的定制化。