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-