基于上一次【​​Launcher类源码分析​​】Launcher的分析继续,上次分析到了这:

自定义系统类加载器源码分析与forName方法底层剖析_构造方法

接着创建应用类加载器,其创建过程其扩展类加载器类似,如下:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_02

这里有一个细节:

自定义系统类加载器源码分析与forName方法底层剖析_jvm_03

因为扩展类加载器是应用类加载器的父亲,所以没必要也记录扩展类加载器,其中也可以看到在创建应用类加载器时将扩展类加载器给传进去了:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_04

具体看一下创建的细节:

自定义系统类加载器源码分析与forName方法底层剖析_jvm_05

自定义系统类加载器源码分析与forName方法底层剖析_自定义_06

然后再看一下AppClassLoader的构建细节:

自定义系统类加载器源码分析与forName方法底层剖析_自定义_07

好~~此时AppClassLoader已经创建好了,回到主流程继续往下分析:

自定义系统类加载器源码分析与forName方法底层剖析_自定义_08

关于什么是上下文类加载器未来会单独进行学习,因为它是非常重要的一个概念,这里先简要略过。

自定义系统类加载器源码分析与forName方法底层剖析_自定义_09

至此Laucher()的构造方法就已经分析完了,这时再回到ClassLoader的主流程中继续分析:

自定义系统类加载器源码分析与forName方法底层剖析_自定义_10

自定义系统类加载器源码分析与forName方法底层剖析_构造方法_11

将其赋值给了ClassLoader的scl变量:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_12

接下来分析就会看到一个不太清楚是何意的代码了,如下:

自定义系统类加载器源码分析与forName方法底层剖析_自定义_13

其实这段代码就是做一些权限的校验,此时就得先看一下SystemClassLoaderAction类了:

自定义系统类加载器源码分析与forName方法底层剖析_构造方法_14

自定义系统类加载器源码分析与forName方法底层剖析_jvm_15

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_16

咱们只要知道当校验完成之后会调用它的run()方法,所以将焦点定位到run()方法:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_17

如之前咱们定义的:

自定义系统类加载器源码分析与forName方法底层剖析_构造方法_18

好,如果用户自定义系统属性的话,则会继续往下走,如下:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_19

其中又会验证之前的一个东东:

自定义系统类加载器源码分析与forName方法底层剖析_自定义_20

所以在之前咱们去实验自定义系统类加载器时需要手动给类加载增加一个带ClassLoader的构造方法,如下:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_21

所以通过源码的分析就能知道其本因,接着创建一个实例:

自定义系统类加载器源码分析与forName方法底层剖析_自定义_22

然后最后又看到了一个设置上下文类加载器的代码:

自定义系统类加载器源码分析与forName方法底层剖析_构造方法_23

最后返回咱们自定义的系统类加载器:

自定义系统类加载器源码分析与forName方法底层剖析_jvm_24

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_25

另外在run()方法中对于这段代码因为关注流程将其给简单略过了,如下:

自定义系统类加载器源码分析与forName方法底层剖析_jvm_26

由于它是一个挺重要的东东,所以有必要进去看一下它的javadoc,如下:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_27

自定义系统类加载器源码分析与forName方法底层剖析_自定义_28

自定义系统类加载器源码分析与forName方法底层剖析_构造方法_29

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_30

自定义系统类加载器源码分析与forName方法底层剖析_自定义_31

自定义系统类加载器源码分析与forName方法底层剖析_jvm_32

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_33

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_34

然后简单看一下它的实现:

自定义系统类加载器源码分析与forName方法底层剖析_构造方法_35

自定义系统类加载器源码分析与forName方法底层剖析_jvm_36

自定义系统类加载器源码分析与forName方法底层剖析_jvm_37

自定义系统类加载器源码分析与forName方法底层剖析_构造方法_38

好~~了解了forName()之后,下面再来体会一下调用代码:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_39

而forName()只有一个参数的实现如下:

自定义系统类加载器源码分析与forName方法底层剖析_类加载器_40






关注个人公众号,获得实时推送

自定义系统类加载器源码分析与forName方法底层剖析_jvm_41