双亲委派机制
检查一下指定名称的类是否已经加载过,如果加载过了,就不需要再加载,直接返回。若没有加载过,该类会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。
双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载。

为什么要设计双亲委派机制?
1. 沙箱安全机制:防止核心API库被随意篡改
2. 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一 次,保证被加载类的唯一性
全盘负责委托机制
“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类
所依赖及引用的类也由这个ClassLoder载入。
自定义类加载器示例:
自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法,一个是
loadClass(String, boolean),实现了双亲委派机制,还有一个方法是findClass,默认实现是空
方法,所以我们自定义类加载器主要是重写findClass方法。
public class MyClassLoaderTest {
static class MyClassLoader extends ClassLoader {
private String classPath;
public MyClassLoader(String classPath) {
this.classPath = classPath;
}
private byte[] loadByte(String name) throws Exception {
name = name.replaceAll("\\.", "/");
FileInputStream fis = new FileInputStream(classPath + "/" + name
+ ".class");
int len = fis.available();
byte[] data = new byte[len];
fis.read(data);
fis.close();
return data;
}
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
byte[] data = loadByte(name);
//defineClass将一个字节数组转为Class对象,这个字节数组是class文件读取后最终的字节数组。
return defineClass(name, data, 0, data.length);
} catch (Exception e) {
e.printStackTrace();
throw new ClassNotFoundException();
}
}
}
public static void main(String args[]) throws Exception {
//初始化自定义类加载器,会先初始化父类ClassLoader,其中会把自定义类加载器的父加载
//器设置为应用程序类加载器AppClassLoader
MyClassLoader classLoader = new MyClassLoader("D:/test");
//D盘创建 test/c

双亲委派机制是Java类加载的一种策略,旨在确保核心类库的安全性和避免类重复加载。当自定义类加载器时,通常会遵循此机制。然而,Tomcat为了解决应用程序隔离、类库版本冲突和jsp热加载等问题,打破了双亲委派机制,采用独特的类加载器结构,如commonLoader、catalinaLoader、sharedLoader和WebappClassLoader等,以实现不同web应用的类库隔离和功能需求。
最低0.47元/天 解锁文章
2589

被折叠的 条评论
为什么被折叠?



