1、Parents Delegation Model,这里的 Parents翻译成双亲有点不妥,类加载向上传递的过程中只有单亲;parents更多的是多级向上的意思。
2、除了顶层的启动类加载器,其他的类加载器在加载之前,都会委派给它的父加载器进行加载,一层层向上传递,直到所有父类加载器都无法加载,自己才会加载该类。
3、双亲委派模型,更好地解决了各个类加载器协作时基础类的一致性问题,避免类的重复加载;防止核心API库被随意篡改。
JDK9之前
1、启动类加载器(Bootstrp ClassLoader),加载/lib/rt.jar、-Xbootclasspath
2、扩展类加载器(Extension ClassLoader),由sun.misc.Launcher$ExtClassLoader来实现,加载/lib/ext、java.ext.dir
3、应用程序类加载器(Application ClassLoader),由sun.misc.Launcher.AppClassLoader来实现,加载 CLASSPTH、-classpath、-cp、Manifest
4、自定义类加载器
JDK 9开始 Extension ClassLoader 被 Platform ClassLoader取代,启动类加载器、平台类加载器、应用程序类加载器全都继承于
jdk.internal.loader.BuiltinClassLoader
类加载代码逻辑
protected synchronized Class<?> loadClass(String name,boolean resolve) throws ClassNotFoundException{
//首先,检查请求的类是否已经被加载过了
Class c = findLoadedClass(name);
if(c == null){
try{
if(parent != null){
c = parent.loadClass(name,false);
}else{
c = findBootstrapClassOrNull(name);
}
}catch(ClassNotFoundException e){
//如果父类加载器抛出ClassNotFoundException
//说明父类加载器无法完成加载请求
}
if(c == null){
//在父类加载器无法加载时
//再调用本身的findClass方法类进行类加载
c = findClass(name);
}
}
if(resolve){
resovleClass(c);
}
return c;
}
Was this helpful?
0 / 0