首页 技术 正文
技术 2022年11月23日
0 收藏 938 点赞 4,312 浏览 2665 个字

 

Launcher启动类


本文是双亲委派机制的源码分析部分,类加载机制中的双亲委派模型对于jvm的稳定运行是非常重要的不过源码其实比较简单,接下来简单介绍一下 我们先从启动类说起有一个Launcher类   sun.misc.Launcher;[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 仔细看下这简短的几行注释,可以得到有用的信息ps:直接IDE里面查看反编译的,看不到注释的,可以下载openJDK查看源码,我的这个版本是openjdk-8-src-b132-03_mar_2014 

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

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

创建          扩展          类加载器
创建          应用程序    类加载器
设置ContextClassLoader
如果需要安装安全管理器 security manager

其中launcher是staitc的,所以初始化的时候就会创建对象,也就是触发了构造方法,所以初始化的时候就会执行上面四个步骤[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 ExtClassLoader 和  AppClassLoader  都是Launcher的静态内部类[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的而且,他们也都是ClassLoader的实现类[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 看下ExtClassLoader的创建中的关键几步[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 也在看下AppClassLoader的创建中的关键几步[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 另外还有Launcher类中的静态变量[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 你应该可以想得到下面这三个到底是什么东西,如果真不懂,你需要再去研究下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 

  

[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的ps:本文中的不少地方,我都在”父类加载器” 的”父 “和”类加载器”中间加了几个空格千万不要理解成父类加载器  ,<父    类加载器> 指的是类加载器的加载顺序层级结构的优先顺序   而不是平时说的继承关系中的父类 父 意味着他的上一层级 

getSystemClassLoader 获取AppClassLoader 的过程

[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 那么再回头看一眼  应用程序   类加载器的构造扩展  类加载器作为参数传递给了他,他最终调用的就是ClassLoader 的一个参数的构造方法   将ExtClassLoader 设置为 AppClassLoader  的parent[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 而ExtClassLoader,他的parent 是null[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 ps:启动  类加载器 是虚拟机的一部分,可能c/c++/java实现的,所以不是java语言的一部分所以对于java本身来说,可以说他是不存在的,但是JVM是知道他的所以说,此处为null ,parent为null说明他的父    类加载器是启动类加载器   或者可能就是启动  类加载器本身


loadClass与findClass

想要实现类 加载器,需要继承ClassLoader 并且有两个重要的方法看下两个重要方法的声明,你可能就感觉出来了,想想public 和 protected都是啥意思?[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 

loadClass方法是类加载器执行   加载类逻辑   的方法,包括检查是否已经加载,调用父类加载,失败则自己尝试使用 findClass方法加载
findClass当前类加载器 实际执行加载二进制流的具体行为方法

 

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

 [五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 再来看看ClassLoader的loadClass方法他会调用parent的loadClass方法,如果他的parent不为空,将会一直调用父 类加载器, 直到最顶级的  启动   类加载器  如果 启动   类加载器仍旧找寻不到, 那么调用自身的findClass  [五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 如果自己调用findClass加载失败呢?很显然, 函数调用结束之后,会返回到调用点位置,调用栈的形式嘛也就是经过[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的必然要继续执行他的下一段如果没抛出异常的话,就会走到下面这里[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的显然这就完成了一整个的双亲委派的类加载模式 [五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的 

总结

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,028
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,518
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,365
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,146
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,780
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,857