趣文网 > 作文大全

一文读懂java类加载之双亲委派机制

2020-12-02 04:05:01
相关推荐

一个编译后的class文件,想要在JVM中运行,就需要先加载到JVM中。java中将类的加载工具抽象为类加载器,而通过加载工具加载类文件的具体方式被称为双亲委派机制。

知识点

类加载器:通过一个类全限定名称来获取其二进制文件(.class)流的工具。

前述

首先明确一点,Java中类是描述一类对象的行为和状态,拥有封装、继承、多态特征。而类加载器这个对象在类结构上都是抽象类ClassLoader的子类

publicabstractclassClassLoader{...}

根据具体功能不同,JDK提供了多个具体子类,例如:ExtClassLoader、AppClassLoader、URLClassLoader、MethodUtil等。

再明确一点,有了类加载功能,但还是考虑实际使用。例如,了解java的都知道java底层使用的是c++。也就是说C++也可以实现类加载文件,也可以说是文件加载功能。在实际使用中也是这么做的,那么这部分被加载的类的加载器如何在Java中描述呢?下面来描述

JDK实际采用的类加载方式,被称为双亲委派机制。其主要分类如下,这是一种抽象概念

Bootstrap ClassLoader系统类(rt.ar)的类加载器,采用C++代码加载Extension ClassLoader扩展类(ext.jar)的类加载器,采用ExtClassLoader加载Application ClassLoader用户类路径(classpath)上类的类加载器,采用AppClassLoader加载自定义类加载器自定义的类加载器,继承ClassLoader即可双亲

既然称为双亲委派机制,则双亲是必须存在的。ClassLoader类存在一个parent属性。因此可以配置双亲。这个双亲是指ExtClassLoader和AppClassLoader,在JDK中则是这样设置:

自定义的类加载器在构建时,如果未指定parent,则使用getSystemClassLoader()来获取父类加载器,而该方法默认获取的就是AppClassLoader。

以上的类加载方式,图示如下

委派

双亲设置之后,便可以委派了,委派过程也就是类文件加载过程,

文字描述下这段代码:

加载类文件之前,先验证是否被加载过了,如果加载过就不再加载,防止被覆盖掉,也防止多次加载浪费资源。然后获取类加载器的parent

如果parent不存在,则说明本身已经是ExtClassLoader了,则查询下类文件是否被Bootstrap ClassLoader加载过,找到就返回,否则返回null。如果parent存在,则让父类加载器去加载类文件,这个过程是往上递推的,如 parent->parent->parent以上流程处理完毕,如果发现返回的是null则说明已经递推到了Bootstrap ClassLoader且仍不能加载,则说明该类文件不符合所有的父类加载器的加载条件,于是便轮到自己来加载了。 上面说明中往上递推的过程就是委派了,而递推的方式是parent,于是就称为双亲委派机制。当然通俗理解是父类加载器优先加载模式。

后记

在委派流程,描述了在该类文件不符合所有的父类加载器的加载条件,于是便轮到自己来加载了。这里说明下加载条件

在Launcher指定了Bootstrap ClassLoader的加载文件夹

System.getProperty("sun.boot.class.path");

这个主要就是JDK指定的librt包

在ExtClassLoader中指定了加载文件夹:

String var0 = System.getProperty("java.ext.dirs");

这个主要就是JDK指定的libext包

在AppClassLoader中指定了加载文件夹:

String var1 = System.getProperty("java.class.path");

都是环境变量,自行可配。这个主要指的是开发中的类路径

由于AppClassLoader与ExtClassLoader都继承了URLClassLoader因此都会进行加载条件判断,如果是自定义的则可以重写loadClass来绕过双亲委派。当然不论怎么重写,加载二进制流的方法会校验类文件不能是加载以java开头的包中的类,这个是绕不过去的。

自定义类加载器示例

控制台

想了解更多精彩内容,快来关注计算机java编程

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

端午记事作文800字 端午节作文500字五年级 我想成为一名医生英语作文 五年级下册作文童年趣事 二十年后的家乡作文450字 我想握住你的手800字作文 我好想长大作文500字 我的读书故事作文450字 欢乐的春节作文500字 2005年山东高考作文 记事的作文500字以上 植物作文怎么写300字三年级 我最喜欢的体育运动英语作文 吉林省今年高考作文 童年趣事作文300字左右 热心肠的人作文300字 我和书的故事作文450字 快乐端午节作文450字 2017年河南高考作文 生命诚可贵作文600字 感恩母亲的作文1000字 人生不留遗憾作文素材 读万卷书不如行万里路作文 难忘的一瞬间作文600字 高考作文类型有哪几种 六一儿童节去玩的作文 我说我的青春故事作文 安徽语文高考作文题 只要有梦想作文600字 以读书为话题写一篇作文