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

本文深入剖析Java类加载器的工作原理,重点介绍了Launcher及其组成部分AppClassLoader的创建过程,并简要提及上下文类加载器的概念。

基于上一次【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()只有一个参数的实现如下:

转载于:https://www.cnblogs.com/webor2006/p/9246850.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值