JVM——类加载器
创始人
2024-05-24 02:40:02
0

目录

    • 一、类加载器
      • 类与类加载器
      • 启动类加载器
      • 拓展类加载器
      • 自定义类加载器

一、类加载器

Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(ClassLoader)

类与类加载器

类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段

对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等

以JDK 8为例

名称加载的类(目录)说明
Bootstrap ClassLoader(启动类加载器)JAVA_HOME/jre/lib无法直接访问
Extension ClassLoader(拓展类加载器)JAVA_HOME/jre/lib/ext上级为Bootstrap,显示为null
Application ClassLoader(应用程序类加载器)classpath上级为Extension
自定义类加载器自定义上级为Application

启动类加载器

可通过在控制台输入指令,使得类被启动类加器加载

拓展类加载器

如果classpath和JAVA_HOME/jre/lib/ext 下有同名类,加载时会使用拓展类加载器加载。当应用程序类加载器发现拓展类加载器已将该同名类加载过了,则不会再次加载

双亲委派模式
双亲委派模式,即调用类加载器ClassLoader 的 loadClass 方法时,查找类的规则

loadClass源码

protected Class loadClass(String name, boolean resolve)throws ClassNotFoundException
{synchronized (getClassLoadingLock(name)) {// 首先查找该类是否已经被该类加载器加载过了Class c = findLoadedClass(name);//如果没有被加载过if (c == null) {long t0 = System.nanoTime();try {//看是否被它的上级加载器加载过了 Extension的上级是Bootstarp,但它显示为nullif (parent != null) {c = parent.loadClass(name, false);} else {//看是否被启动类加载器加载过c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader//捕获异常,但不做任何处理}if (c == null) {//如果还是没有找到,先让拓展类加载器调用findClass方法去找到该类,如果还是没找到,就抛出异常//然后让应用类加载器去找classpath下找该类long t1 = System.nanoTime();c = findClass(name);// 记录时间sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}
}

自定义类加载器

使用场景(什么时候需要自定义类加载器)
◆ 想加载非 classpath 随意路径中的类文件
◆ 通过接口来使用实现,希望解耦时,常用在框架设计
◆ 这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于 tomcat 容器

步骤
① 继承ClassLoader父类
② 要遵从双亲委派机制,重写 findClass 方法
——不是重写loadClass方法,否则不会走双亲委派机制
③ 读取类文件的字节码
④ 调用父类的 defineClass 方法来加载类
⑤ 使用者调用该类加载器的 loadClass 方法

破坏双亲委派模式
◆ 双亲委派模型的第一次“被破坏”其实发生在双亲委派模型出现之前——即JDK1.2面世以前的“远古”时代
——建议用户重写findClass()方法,在类加载器中的loadClass()方法中也会调用该方法

◆ 双亲委派模型的第二次“被破坏”是由这个模型自身的缺陷导致的
——如果有基础类型又要调用回用户的代码,此时也会破坏双亲委派模式

◆ 双亲委派模型的第三次“被破坏”是由于用户对程序动态性的追求而导致的
——这里所说的“动态性”指的是一些非常“热”门的名词:代码热替换(Hot Swap)、模块热部署(Hot Deployment)等

相关内容

热门资讯

浙江高考满分作文:人生应读三... 浙江高考满分作文:人生应读三本书 篇一人生应读三本书在我们的一生中,书籍扮演着重要的角色,它们不仅是...
高考满分议论文【精彩6篇】 高考满分议论文 篇一高考满分:是成功的唯一标准吗?高考作为我国教育体制的重要组成部分,一直以来备受争...
北京市高考作文题【推荐3篇】 北京市高考作文题 篇一互联网时代下的人际关系互联网的发展给人们的生活带来了很多便利,但同时也对人际关...
高考满分作文:浅阅读与深阅读... 高考满分作文:浅阅读与深阅读 篇一浅阅读与深阅读在当今信息爆炸的时代,我们每天都面临大量的文字信息。...
高考素材之古诗词中“酒”的名... 高考素材之古诗词中“酒”的名字 篇一古代诗词中,酒是一个常见的题材,它象征着欢乐、快乐和人情味道。下...
江苏高考作文题目:车来车往折... 江苏高考作文题目:车来车往折射社会真理 篇一车来车往 折射社会真理车来车往,车辆穿梭于城市的大街小巷...
浙江高考满分作文:门与路(通... 浙江高考满分作文:门与路 篇一门与路,是生活中不可或缺的元素。门是通往不同世界的通道,而路则是连接一...
高考教室标语(最新3篇) 高考教室标语 篇一高考教室标语对学生的激励作用高考是每个学生都必须面对的一道坎,而高考教室则是他们备...
全国卷一作文【优质3篇】 全国卷一作文 篇一:如何培养孩子的创造力创造力是现代社会对于个体发展的重要要求之一。而培养孩子的创造...
2022年江苏新高考I卷作文... 2022年江苏新高考I卷作文 篇一新高考改革下的多元化教育模式探析 2022年江苏新高考I卷作文 篇...
2022高考作文围棋范文【优... 2022高考作文围棋范文 篇一围棋与我的成长围棋是一门古老而深奥的智力游戏,它给了我许多启示和帮助,...
高考零分作文出:我的共享幸福... 篇一:高考零分作文出:我的共享幸福计划近年来,共享经济在我国发展迅速,各种共享平台如雨后春笋般涌现。...
天津高考作文题【精选3篇】 天津高考作文题 篇一我心中的天津天津,这座位于华北地区的城市,是我生活了十几年的家。它不仅是中国的直...
高考作文素材积累【最新3篇】 高考作文素材积累 篇一高考作文素材积累是每个高中生备战高考时必备的一项重要任务。作文是高考语文科目中...
高考满分作文800字【精简6... 高考满分作文800字 篇一我的高中生活高中三年,如同一场华丽的冒险,我在其中探索着自我、成长着、收获...
成人高考作文(精彩6篇) 成人高考作文 篇一:教育的重要性教育是人类社会发展的重要基石,也是个人成长的关键因素。随着社会的进步...
高考范文历史人物英语(推荐6... 高考范文历史人物英语 篇一:The Life and Contributions of Confuc...
高考作文题预测:追随心的指引... 高考作文题预测:追随心的指引 篇一在现代社会中,我们常常被外界的声音所左右,很难真正追随自己内心的声...
提高高考成绩的方法(精选3篇... 提高高考成绩的方法 篇一高考是每个学生人生中的重要时刻,它对于一个人的未来发展起着决定性的作用。因此...
高考志愿填报:如何选择合适自... 高考志愿填报:如何选择合适自己的专业 篇一在高考志愿填报的过程中,选择合适自己的专业显得尤为重要。毕...