竹笋

首页 » 问答 » 问答 » JVM篇类加载器的三种分类及双亲委派
TUhjnbcbe - 2025/7/21 17:43:00
美图求赞

01类加载器分类详解

类加载器通常可以分为三种:

启动类加载器(BootstrapClassLoader)扩展类加载器(ExtClassLoader)应用程序类加载器(AppClassLoader)

1、启动类加载器

启动类加载器是由c++实现的,是虚拟机的一部分,主要负责加载jvm自身需要的类,即负责加载$AVAHOME$下的核心类库。打印下启动类加载器的加载路径,代码如下:

URLClassPathpath=Launcher.getBootstrapClassPath();

for(URLurl:path.getURLs()){

log.info(url.getPath());

}

输出结果:

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/resources.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/rt.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/sunrsasign.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/jsse.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/jce.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/charsets.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/jfr.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/classes

因是c++直接实现的启动类加载器,所以这是唯一没有继承java中ClassLoder的类加载器。扩展类加载器和应用程序类加载器都继承了ClassLoder

2、扩展类加载器

扩展类加载器是由java实现的,具体实现类是sun.misc.Launcher$ExtClassLoader,如下图:

ExtClassLoader类

打印一下扩展类加载器的实例化对象来确认下扩展类加载的实现

URLClassLoaderextClassLoader=(URLClassLoader)ClassLoader.getSystemClassLoader().getParent();

log.info(extClassLoader);

输出结果:sun.misc.Launcher$ExtClassLoader

acfe

打印下扩展类加载器的加载路径,代码如下:

URLClassLoaderextClassLoader=(URLClassLoader)ClassLoader.getSystemClassLoader().getParent();

for(URLurl:extClassLoader.getURLs()){

log.info(url.getPath());

}

输出结果:

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/access-bridge-64.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/cldrdata.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/dnsns.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/jaccess.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/jfxrt.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/localedata.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/nashorn.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/sunec.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/sunjce_provider.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/sunmscapi.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/sunpkcs11.jar

/C:/Program%20Files/Java/jdk1.8.0_/jre/lib/ext/zipfs.jar

扩展类记载器加载路径的代码在sun.misc.Launcher$ExtClassLoader的getExtDirs函数中,代码如下:

privatestaticFile[]getExtDirs(){

Stringvar0=System.getProperty(java.ext.dirs);

File[]var1;

if(var0!=null){

StringTokenizervar2=newStringTokenizer(var0,File.pathSeparator);

intvar3=var2.countTokens();

var1=newFile[var3];

for(intvar4=0;var4var3;++var4){

var1[var4]=newFile(var2.nextToken());

}

}else{

var1=newFile[0];

}

returnvar1;

}

java.ext.dirs这个目录下的所有jar包都被加载了,那问题来了,扩展类加载器是负责加载这个路径下的所有jar包,还是只负责规定好的jar包呢,让我们试一下,在这个路径下放一个其他的jar包,放了一个工具类jar包mg-

1
查看完整版本: JVM篇类加载器的三种分类及双亲委派