自定义系统类加载器源码分析与forName方法底层剖析
基于上一次【https://www.cnblogs.com/webor2006/p/9240898.html】Launcher的分析继续,上次分析到了这:
接着创建应用类加载器,其创建过程其扩展类加载器类似,如下:
这里有一个细节:
因为扩展类加载器是应用类加载器的父亲,所以没必要也记录扩展类加载器,其中也可以看到在创建应用类加载器时将扩展类加载器给传进去了:
具体看一下创建的细节:
然后再看一下AppClassLoader的构建细节:
好~~此时AppClassLoader已经创建好了,回到主流程继续往下分析:
关于什么是上下文类加载器未来会单独进行学习,因为它是非常重要的一个概念,这里先简要略过。
至此Laucher()的构造方法就已经分析完了,这时再回到ClassLoader的主流程中继续分析:
将其赋值给了ClassLoader的scl变量:
接下来分析就会看到一个不太清楚是何意的代码了,如下:
其实这段代码就是做一些权限的校验,此时就得先看一下SystemClassLoaderAction类了:
咱们只要知道当校验完成之后会调用它的run()方法,所以将焦点定位到run()方法:
如之前【https://www.cnblogs.com/webor2006/p/9226624.html】咱们定义的:
好,如果用户自定义系统属性的话,则会继续往下走,如下:
其中又会验证之前的一个东东:
所以在之前咱们去实验自定义系统类加载器时需要手动给类加载增加一个带ClassLoader的构造方法,如下:
所以通过源码的分析就能知道其本因,接着创建一个实例:
然后最后又看到了一个设置上下文类加载器的代码:
最后返回咱们自定义的系统类加载器:
另外在run()方法中对于这段代码因为关注流程将其给简单略过了,如下:
由于它是一个挺重要的东东,所以有必要进去看一下它的javadoc,如下:
然后简单看一下它的实现:
好~~了解了forName()之后,下面再来体会一下调用代码:
而forName()只有一个参数的实现如下: