自定义系统类加载器源码分析与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()只有一个参数的实现如下:

自定义系统类加载器源码分析与forName方法底层剖析的更多相关文章
- 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- linux调度器源码分析 - 运行(四)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经将调度器的数据结构.初始化.加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运 ...
- linux调度器源码分析 - 初始化(二)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明 ...
- Linux 内核调度器源码分析 - 初始化
导语 上篇系列文 混部之殇-论云原生资源隔离技术之CPU隔离(一) 介绍了云原生混部场景中CPU资源隔离核心技术:内核调度器,本系列文章<Linux内核调度器源码分析>将从源码的角度剖析内 ...
- 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- netty源码分析(十八)Netty底层架构系统总结与应用实践
一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...
- spark 源码分析之十--Spark RPC剖析之TransportResponseHandler、TransportRequestHandler和TransportChannelHandler剖析
spark 源码分析之十--Spark RPC剖析之TransportResponseHandler.TransportRequestHandler和TransportChannelHandler剖析 ...
- OkHttp3 拦截器源码分析
OkHttp 拦截器流程源码分析 在这篇博客 OkHttp3 拦截器(Interceptor) ,我们已经介绍了拦截器的作用,拦截器是 OkHttp 提供的对 Http 请求和响应进行统一处理的强大机 ...
- struts2拦截器源码分析
前面博客我们介绍了开发struts2应用程序的基本流程(开发一个struts2的实例),通过前面我们知道了struts2实现请求转发和配置文件加载都是拦截器进行的操作,这也就是为什么我们要在web.x ...
随机推荐
- List的add方法与addAll方法的区别、StringBuffer的delete方法与deleteCharAt的区别
List的add方法与addAll方法 区别 add add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素 addAll addAll是传 ...
- cvpr2015papers
@http://www-cs-faculty.stanford.edu/people/karpathy/cvpr2015papers/ CVPR 2015 papers (in nicer forma ...
- vscode自动生成文件头部注释和函数注释
参考链接:https://blog.csdn.net/sueRimn/article/details/88048276
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中
本文需要参考前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中 上文是导出的运行的依赖jar被放在了子目录中,本文是将依赖jar放在可运行jar的本身,这样发布的 ...
- private关键字 this关键字
基本类型的布尔值boolean定义get方法,名称应该为isMale 当方法的局部变量和类的成员变量重名的时候,根据就近原则,有限使用局部变量, 如果需要访问成员变量 则使用this.name 构造 ...
- linux 系统自签免费ssl证书和nginx配置
首先执行如下命令生成一个key openssl genrsa -des3 -out ssl.key 1024 然后他会要求你输入这个key文件的密码.不推荐输入.因为以后要给nginx使用.每次rel ...
- ubuntu下java的安装与执行
一.安装java sudo add-apt-repository ppa:linuxuprising/java sudo apt-get update sudo apt-get install ora ...
- Photon Server LoadBalancing搭建
准备:申请3台Windows虚拟机. 3台虚拟机上都部署上Photon Server. 一.主虚拟机上部署MasterServer. (1)在第一台虚拟机中,部署的Photon Server目目录下找 ...
- PHP无限极菜单
权限表结构 CREATE TABLE `blog_auth` ( `id` ) unsigned NOT NULL AUTO_INCREMENT COMMENT '序号', `pid` ) NOT N ...
- opencv实现人脸识别(二) 人脸图像采集模块
这一步我们开始搭建第一个模块,用来检测到图像中的人脸位置,并将它拍下来保存在指定路径 流程图: 代码实现: import cv2 def pic(cam): # 调用笔记本内置摄像头,所以参数为0,如 ...