1.JVM加载类是具有父子层级结构

简单来说,在类加载时,类加载器首先会委托父类加载器进行加载,如果找不到,继续委托父类加载器加载类,直到引导类加载器。(从下往上)
如果最顶级类加载器在其类加载路径下也没加载到当前类的话,那将由委派最近级别的子类加载器进行类加载。(从上往下)
注意点:这里所描述的父类加载器,其实不是指的是 类之间的关系,而是表示类的一个parent属性而已。

2.双亲委派的优点:
2.1.防止窜改核心类库中的类
2.2.确保类只会被加载一次
3.双亲委派是如何实现的,对应具体 keyMethod

4.自定义类加载器打破双亲委派
为啥要打破?
例如在tomcat中要实现部署多个war包,每个war包中所依赖的spring组件版本不一致,会出现包名和类名一致,但是里面方法有差异性的情况
4.1.继承ClassLoader
4.2.重写findClass方法(具体找加载类的实现方法)
4.3.重写loadClass方法(可以理解为层级加载类算法)

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);
return defineClass(name, data, 0, data.length);
} catch (Exception e) {
e.printStackTrace();
//throw new ClassNotFoundException();
Class<?> aClass = super.findClass(name);
return aClass;
}
}
2396

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



