问题来源
首先为什么会有这么一个问题呢?主要还是因为网上充斥着各种JAVA ClassLoader的相关文章,什么:五分钟搞懂ClassLoader、深入浅出ClassLoader、一看就懂的ClassLoader等等。
可是,当你看的文章多了,想必就会有如题般的疑惑:AppClassLoader与SystemClassloader是一个东西吗?为什么会有这个疑惑呢,我们看看这些图:
从上面的类加载器委派关系图中我们可以看到,BootstrapClassLoader 和ExtentClassLoader是大家都有的。可是到了第三层,不同的图显示的ClassLoader却是不一样的:有的是SystemClassLoader,而有的是AppClassLoader。
那么到底正确的应该是SystemClassLoader还是AppClassLoader呢?还是说这俩其实是一个东西?又或者说不同的JDK版本,这俩是不一样的?
02问题解析
Java虚拟机规范「1」中指出,Class Loader分为Bootstrap Class Loader以及User-defined Class Loader,其中Bootstrap Class Loader是由Java虚拟机使用C++实现的,没有对应的Java对象。
所谓User-defined Class Loader,其实也没有叫这个名称的Java对象,这里是一种泛称,直译过来为用户定义的Class Loader,对应JDK中的Java对象是java.lang.ClassLoader及其子类,除此之外,JDK中还提供了sun.misc.Launcher.ExtClassLoader以及sun.misc.Launcher.AppClassLoader。
那这是不是就意味着SystemClassLoader是错误的不存在的呢?当然也不是,在Jdk9中的ClassLoader的文档「2」中明确指出:
同时有一篇大佬的博客「3」同样有提到:
所以,综上,其实AppClassLoader与SystemClassLoader是一个东西。
所以,看过这篇文章的小伙伴,以后应该就可以摆脱相关的疑惑了。其实,有些知识,我们在想要系统学习的时候,网上的知识内容很多,可是如果稍加细致的观察,我们便能看到许多的问题,而遇到问题后,你是囫囵吞枣,含糊而过,还是打破砂锅问到底也决定了我们之后对学过知识自信程度,这点很重要。
当然,如果你比较懒,还是可以多多关注强哥,提问题留言,大家一起讨论进步哈~