自定义系统类加载器源码分析与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()只有一个参数的实现如下:
最新文章
- Jsonp调用网易云音乐API搜索播放歌曲
- 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)
- mysqldump的实现原理
- 运行mvc3.0项目所需dll
- wsdl中含ref=";s:schema";时处理的
- Jquery.Datatables 结合时间段查询,daterangepicker实现Datatables表格带参数查询
- jquery ajax提交表单数据的两种方式
- armv8(aarch64)linux内核中flush_dcache_all函数详细分析【转】
- ECharts开始
- 第一百一十二节,JavaScript浏览器检测
- pwnable.kr input解题记录
- node 学习(一)
- 如何将WORD表格转换成EXCEL表格
- asp.net-基础-20180320
- PHP(控制语句,随机数,循环语法)
- Bytom 移动端钱包SDK FAQ
- Database学习 - mysql 数据库 外键
- 跳石头|河中跳房子|NOIP2015提高组T4|二分法
- 【HI3520DV200】sample
- LPC43xx SGPIO Slice 输入输出连接表
热门文章
- Mysql 设置远程连接(自用-----仅供参考)
- Java中的一些关键字:static,final,和abstract,interface,以及访问修饰符说明
- lua 元表Metatable (六)
- kafka2.10集群搭建(一)
- javascript当中类型转换,typeof的用法
- Flask Bug记录之JinJa2.exceptions.UndefinedError: 'sqlite3.Row object' has no attribute 'get'
- 在Eclipse中手动为其添加spring组件开发支持
- 第1章:Python语言与Linux系统管理
- 第十章 ZYNQ-MIZ701 DDR3 PS读写操作方案
- 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末