Launcher启动类

本文是双亲委派机制的源码分析部分,类加载机制中的双亲委派模型对于jvm的稳定运行是非常重要的不过源码其实比较简单,接下来简单介绍一下我们先从启动类说起有一个Launcher类 sun.misc.Launcher;

仔细看下这简短的几行注释,可以得到有用的信息ps:直接IDE里面查看反编译的,看不到注释的,可以下载openJDK查看源码,我的这个版本是openjdk-8-src-b132-03_mar_2014

sun.misc.Launcher 这个类是系统用于启动主应用的启动器

构造方法 Launcher() 中做了四件事情

创建 扩展 类加载器

创建 应用程序 类加载器

设置ContextClassLoader

如果需要安装安全管理器 security manager

其中launcher是staitc的,所以初始化的时候就会创建对象,也就是触发了构造方法,所以初始化的时候就会执行上面四个步骤

ExtClassLoader 和 AppClassLoader 都是Launcher的静态内部类

而且,他们也都是ClassLoader的实现类

看下ExtClassLoader的创建中的关键几步

也在看下AppClassLoader的创建中的关键几步

另外还有Launcher类中的静态变量

你应该可以想得到下面这三个到底是什么东西,如果真不懂,你需要再去研究下System.getProperty("sun.boot.class.path")System.getProperty("java.ext.dirs")System.getProperty("java.class.path")

ClassLoader的构造方法

前面说过,对于虚拟机来说只有两种类加载器启动类加载器以及其他所有,而其他所有都是java.lang.ClassLoader的子类所以想要自定义类加载器,必须要继承实现ClassLoader而且,我们上面说到的,java给我们提供的AppClassLoader 和 ExtClassLoader 也都是ClassLoader的子类看下ClassLoader的构造方法和变量parent你会发现,其实构造方法实际上只有双参数版本这一种第二个参数为parent,这个parent是一个ClassLoader, 用于记录他的 父 类加载器

不管调用哪个构造方法 parent必然会被初始化 要么是你调用带参数的构造方法, 显式指定一个来设置parent 如果你不指定,默认的构造方法,会使用 getSystemClassLoader返回的AppClassLoader 设置parent

ps:本文中的不少地方,我都在"父类加载器" 的"父 "和"类加载器"中间加了几个空格千万不要理解成父类加载器 , 指的是类加载器的加载顺序层级结构的优先顺序 而不是平时说的继承关系中的父类 父 意味着他的上一层级

getSystemClassLoader 获取AppClassLoader 的过程

那么再回头看一眼 应用程序 类加载器的构造扩展 类加载器作为参数传递给了他,他最终调用的就是ClassLoader 的一个参数的构造方法将ExtClassLoader 设置为 AppClassLoader 的parent

而ExtClassLoader,他的parent 是null

ps:启动 类加载器 是虚拟机的一部分,可能c/c++/java实现的,所以不是java语言的一部分所以对于java本身来说,可以说他是不存在的,但是JVM是知道他的所以说,此处为null ,parent为null说明他的父 类加载器是启动类加载器 或者可能就是启动 类加载器本身

loadClass与findClass

想要实现类 加载器,需要继承ClassLoader并且有两个重要的方法看下两个重要方法的声明,你可能就感觉出来了,想想public 和 protected都是啥意思?

loadClass方法是类加载器执行 加载类逻辑 的方法,包括检查是否已经加载,调用父类加载,失败则自己尝试使用 findClass方法加载

findClass当前类加载器 实际执行加载二进制流的具体行为方法

Launcher.APPClassLoader中的loadClass方法,最终调用的是super.loadClass , 实际上就是ClassLoader的loadClass方法 Launcher.ExtClassLoader 根本就没有实现自己的loadClass 方法,所以使用的也是ClassLoader中的

再来看看ClassLoader的loadClass方法他会调用parent的loadClass方法,如果他的parent不为空,将会一直调用父 类加载器, 直到最顶级的 启动 类加载器如果 启动 类加载器仍旧找寻不到, 那么调用自身的findClass

如果自己调用findClass加载失败呢?很显然, 函数调用结束之后,会返回到调用点位置,调用栈的形式嘛也就是经过

必然要继续执行他的下一段如果没抛出异常的话,就会走到下面这里

显然这就完成了一整个的双亲委派的类加载模式

总结

Launcher作为启动器创建了ExtClassLoader 以及AppClassLoader他们都是ClassLoader的子类,并且ClassLoader有一个parent 指向他的父 类加载器正是这个属性完成了自顶而下的 优先级层级顺序的确定对于sun内置的ExtClassLoader 以及AppClassLoader 以及启动 类加载器 Bootstrap 他们的层级为Bootstrap>ExtClassLoader>ExtClassLoader并且,他们各自有不同的分工通过ClassLoader的loadClass方法,确定了他们的调用逻辑,也就是双亲委派机制每个层级都会向上传递类加载请求,只有上层 父 类加载器调用失败,才会自己尝试加载双亲委派机制的意义重大,带来了更高的安全性等优点不过他的实现逻辑却是的确很简单一个loadClass就搞定了findClass是类加载器自身加载类的具体行为所以,如果你不需要破坏双亲委派机制,只需要覆盖这个方法即可如果你想要完全自定义你的类加载器的逻辑机制,直接覆盖loadClass,当然,你可能还需要继续覆盖findClass

java类加载机制为什么双亲委派_[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的...相关推荐

  1. 视频教程-RPC服务框架(Dubbo)源码分析-Java

    RPC服务框架(Dubbo)源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大 ...

  2. 深入源码分析Java线程池的实现原理

    转载自   深入源码分析Java线程池的实现原理 程序的运行,其本质上,是对系统资源(CPU.内存.磁盘.网络等等)的使用.如何高效的使用这些资源是我们编程优化演进的一个方向.今天说的线程池就是一种对 ...

  3. 视频教程-Spring底层源码分析-Java

    Spring底层源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大促活动技术保 ...

  4. JDK源码分析——Java的SPI机制分析与实战

    重点提示:在我博客中的所有的源码分析的实例,我都将会放到github上,感兴趣的朋友可以下载下来调试运行,我相信还是可以有所收获的.我的目的是让所有读到我博客的朋友都可以了解到有价值的东西,学习到ja ...

  5. Dubbo源码分析系列-深入Dubbo SPI机制

    导语   在之前的博客中介绍过关于Java中SPI的机制,也简单的分析了关于Java中SPI怎么去使用.SPI的全称Service Provider Interface,是一种服务发现机制.SPI的本 ...

  6. android studio 项目源码_这个标星 2.3k+ 的项目带你 Android 源码分析从入门到放弃...

    上次写了一篇 Android 开发者的福利,介绍几款看源码的工具 ,这篇文章主要介绍了三款看 Android 源码的工具,后台有很多同学留言问,有没有分析源码的. 分析源码的文章也很多,但大多数文章不 ...

  7. motan源码分析二:使用spi机制进行类加载

    在motan的源码中使用了很多的spi机制进行对象的创建,下面我们来具体分析一下它的实现方法. 1.在实际的jar包的\META-INF\services目录中引入相关的文件,例如下图中,我解压了co ...

  8. JVM源码分析--ClassLoader类加载器

    本人原创,转载请注明出处:https://www.cnblogs.com/javallh/p/10224187.html 1.JDK已有类加载器: BootStrap ClassLoader (启动类 ...

  9. Hessian源码分析(java)

    个人博客: 戳我,戳我 先扯一扯 前一篇博文Hessian通信案例(java)简单实现了Java版的Hessian客户端和服务端的通信,总体看来,实现起来比较简单,整个基于Hessian的远程调用过程 ...

最新文章

  1. vim php 语法高亮,linux vim配置文件(语法高亮)
  2. Linux服务器编程之:chown()函数,chown命令
  3. Xilinx FPGA GTX的DRP速率配置详解
  4. Performance Metrics(性能指标1)
  5. 那些年,我在阿里当数据开发
  6. HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot-报错解决方法
  7. win7重装系统时,使用PE工具箱进入系统看到的“C盘变成0.2G,D盘变成48G左右”这是什么回事?...
  8. 消息称苹果关联公司1.25亿美元购买车辆测试场 占地超过3万亩
  9. java 视频 缩略图_java获取视频缩略图
  10. pytorch输出分类结果并显示每个类别的概率
  11. python自学网站-自学python有什么网站
  12. Java Lambda
  13. 数据结构与算法分析 C++语言描述(第四版)参考答案
  14. 处女的第一次不一定会流血!很感人 我都流泪了!
  15. 企业股权价值评估:市场法及收益法的评估思路
  16. MATLAB 电子书
  17. 《认识我们人类自己》江湖一剑客
  18. springboot中druid数据源配置无效的问题和jar包找不到问题
  19. 浅析正向代理、反向代理、透明代理
  20. iOS 12 修改微信提示音,无需越狱不用电脑,详细教程

热门文章

  1. word中html的emz和wmz区别,各文件的MIME类型
  2. 虚拟服务器万兆网卡怎么用,万兆网卡的安装以及注意事项
  3. 股票交易系统接口一分钟5000均线如何操作?
  4. TSN协议之安全协议(802.1Qci)的那些事儿
  5. python武汉工资_进来看看学Python的工资有多高?
  6. 易语言大漠插件模块制作后台设置后台绑定窗口句柄
  7. android 炫飞 打印机,好照片打出来 佳能炫飞CP1200打印机体验
  8. 河北奥体中心成石家庄新地标 三伏天办冰雪活动
  9. 安装制作工具开源软件
  10. western blot蛋白条带灰度值扫描——python