双亲委派
Java中的类加载器主要分为以下四类:
- 启动类加载器(BootStrap ClassLoader) , 主要负责加载jre/lib/rt.jar相关的字节码文件的
- 扩展类加载器(Extension ClassLoader) ,主要负载加载 jre/lib/ext/*.jar 这些jar包的。
- 应用程序类加载器(Application ClassLoader) , 主要负责加载用户自定义的类以及classpath环境变量所配置的jar包的。
- 自定义类加载器(UserClassLoader) , 负责加载程序员指定的特殊目录下的字节码文件的。大多数情况下,自定义类加载器只需要继承ClassLoader这个抽象类,重写findClass()和loadClass()两个方法即可。
双亲委派机制的原理
- 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。
- 如果父类的加载器还存在其父类加载器,则进一步向上委托,依次递归请求最终达到顶层的启动类加载器。
- 如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制。
优点
- 避免类的重复加载
- 保护程序安全,防止核心API被随意篡改
缺点
- 在某些场景下双亲委派制过于局限,所以有时候必须打破双亲委派机制来达到目的。例如:SPI机制