BootstrapClassLoader jdk/lib
ExtensionClassLoader jdk/lib/ext
AppClassLoader classpath
类加载器:向上查找,向下加载,
getParent()获取其父 ClassLoader,如果getParent返回的ClassLoader==null
也就是代码中ClassLoader为null的话,那么该类是通过BootstrapClassLoader
1、如果我们不想打破双亲委派模型,就重写 ClassLoader 类中的 findClass() 方法即可,无法被父类加载器加载的类最终会通过这个方法被加载。
2、但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。
为什么是重写 loadClass() 方法打破双亲委派模型呢?双亲委派模型的执行流程已经解释了:
解答:类加载器在进行类加载的时候,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成(调用父加载器 loadClass()方法来加载类)。
protected Class<?> loadClass(String name, boolean resolve){
if (parent != null) {
//当父类的加载器不为空,则通过父类的loadClass来加载该类
c = parent.loadClass(name, false);//递归调用父类,这就是为什么打破就要冲洗loadClass方法,
} else {
//当父类的加载器为空,则调用启动类加载器来加载该类。
c = findBootstrapClassOrNull(name);
}
//上面一直递归,走到这里一定是说明
if (c == null) {
//当父类加载器无法加载时,则调用findClass方法来加载该类
//用户可通过覆写该方法,来自定义类加载器
c = findClass(name);
}
}
JVM 判定两个 Java 类是否相同的具体规则 :JVM 不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即使两个类来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相同。
原文地址:跳转