Java类加载器的父委托机制探究

AI大模型开发——transformer模型超全完整版(0基础可懂) 为了更深入的了解transformer模型,我们首先从transformer的诞生聊起吧。transformer在2017年由Vaswani等人首次提出,它摒弃了之前流行的循环神经网络和卷积神经网络的架构,引入了自注意力机制( Self-Attention),显著提高了处理序列数据的能力和效率。transformer模型的这种设计使其在处理长距离依赖问题时, 相比于传统的循环神经网络和长短期记忆网络(LSTM)表现得更加出色,至此, 开启了NLP技术的新篇章。 阅读详情

0. 前言

类加载器是Java中重要的知识,关于类加载器的介绍网上有很多文章,大家可以去找找,我也写了一篇关于类加载器的博客,大家也可以去看看http://blog.youkuaiyun.com/TimHeath/article/details/52892531
在讲父委托机制之前先把类加载器体系图贴上来
类加载器体系

注意,自定义类加载器的父加载器未必是系统类加载器。可以看见,系统类加载器的父加载器是扩展类加载器,扩展类加载器的父加载器是根类加载器,而根类加载器没有父加载器。其实,除了根类加载器,所有的加载器都有父加载器。

类加载器之间的父子关系并不是Java类中的继承关系,大家要明白,同一个类的不同类加载器之间也可以是父子关系,如上图中的自定义类加载器CustomClassLoader1和CustomClassLoader2,它们可以属于同一个类,然后指定它们的父加载器也可以是同一个类的对象,如,指定CustomClassLoader1的父加载器为CustomClassLoader2也是可以的。在没有指定的情况下系统类加载器便会成为它的父类加载器。

简单介绍一下父委托机制

如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层级的类加载都是如此,因此所有的加载请求最终都应该传送到顶层的根类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。当所有的父类加载器和父类加载器以上的加载器都没加载成功的时候才会轮到当前的类加载器加载,如果当前的类加载器还没加载成功,则会抛出异常,下面的测试会验证这个事情。

为什么要这样子设计了,我也从网上找了一下,基本上是为了安全着想,如下面所说

父亲委托机制的优点是能够提高软件系统的安全性。因为在此机制下,用户自定义的类加载器不可能加载应该由父加载器加载的可靠类,从而防止不可靠甚至恶意的代码代替由父加载器加载的可靠代码。例如,java.lang.Object类总是由根类加载器加载,其他任何用户自定义的类加载器都不可能加载含有恶意代码的java.lang.Object类。

好了,接下来就验证一下是不是他所说的那样。

1. 验证

1.1 准备

  1. 我先写了一个类Dog,等下为了测试用,注意,编译后这个Dog类不能存在于classpath下,这样才能看出测试结果
public class Dog {
    public Dog() {
        System.out.println("Dog is loaded by : " + Dog.class.getClassLoader());
    }
}
  1. 再在D:\myapp下分别新建loader1lib,loader2lib,loader3lib,将类Dog的class文件放到loader1lib和loader3lib中

1.2 自定义类加载器

这是我准备的自定义加载类,关于自定义类加载器更详细的描述大家可以去看看我写的另一篇博客http://blog.youkuaiyun.com/timheath/article/details/52884482,也可以网上找一下,这里便不在详细描述了。

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * 自定义类加载器
 * 
 * @author Jason
 *
 */
public class CustomClassLoader extends ClassLoader {

    private String name;// 类加载器的名字,方便看测试结果
    private String basPath;// 指定加载类的基本路径
    private final String fileType = ".class";// 加载文件的扩展名

    public CustomClassLoader(String name) {
        super();// 让系统类加载器成为该类加载器的父加载器
        this.name = name;
    }

    public CustomClassLoader(String name, ClassLoader parent) {
        super(parent);// 显示指定类加载器的父加载器
        this.name = name;
    }


    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] data = this.loadClassData(name);
        return this.defineClass(name, data, 0, data.length);
    }

    private byte[] loadClassData(String name) {
        InputStream in = null;
        byte[] data = null;
        ByteArrayOutputStream bos = null;
        try {
            // 因为参数传过来的值是edu.jyu.Dog这种类型的,需要替换成edu\jyu\Dog这种类型才能读取
            name = name.replace(".", "\\");
            in = new FileInputStream(new File(basPath + name + fileType));
            bos = new ByteArrayOutputStream();
            int ch = 0;
            while (-1 != (ch = in.read())) {
                bos.write(ch);
            }
            data = bos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
                bos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return data;
    }

    @Override
    public String toString() {
        return this.name;
    }

    public String getBasPath() {
        return basPath;
    }

    public void setBasPath(String basPath) {
        this.basPath = basPath;
    }

}

1.3 测试

下面是测试代码

/**
 * 父委托机制测试
 * 
 * @author Jason
 *
 */
public class Test {

    public static void main(String[] args) throws Exception {

        // 创建一个自定义类加载对象,并设定该类加载的父加载器为系统类加载
        CustomClassLoader loader1 = new CustomClassLoader("loader1");
        loader1.setBasPath("d:\\myapp\\loader1lib\\");
        // 创建一个自定义类加载对象,并设定该类加载的父加载器为loader1
        CustomClassLoader loader2 = new CustomClassLoader("loader2", loader1);
        loader2.setBasPath("d:\\myapp\\loader2lib\\");
        // 创建一个自定义类加载对象,并设定该类加载的父加载器为根类加载器
        CustomClassLoader loader3 = new CustomClassLoader("loader3", null);
        loader3.setBasPath("d:\\myapp\\loader3lib\\");

        test(loader2);// 指定类加载器loader2去加载Dog类
        test(loader3);// 指定类加载器loader3去加载Dog类
    }

    public static void test(ClassLoader loader) throws Exception {
        Class clazz = loader.loadClass("Dog");
        Object object = clazz.newInstance();
    }
}

1.4 大概结构

根据上面的操作和代码,我们可以用一张图来描述
体系结构

1.5 运行结果

Dog is loaded by : loader1
Dog is loaded by : loader3

1.6 结果分析

在上面的代码中,我将loader1的父加载器设为系统类加载器,loader2的父加载器为loader1,loader3的父加载器为根类加载器,那么在执行test(loader2);这句代码的时候,是指定loader2加载器去加载Dog类,而loader2便会委托给它的父加载器loader1去加载,而loader1又往上委托给系统类加载器,系统类加载器委托给扩展类加载器,扩展类加载器委托给根类加载器,很明显loader1上面的几个类加载器都找不到Dog类的,所有又交回给loader1加载,刚好loader1加载路径D:\myapp\loader1lib下有一个Dog.class文件,所有就加载了进来,然后再返回引用给loader2。所以虽然我指定的是loader2去加载Dog类,但是实际上Dog类还是被loader1给加载了。

同理可得,执行test(loader3);这句代码,我指定loader3加载Dog类的时候,会先委托loader3的父加载器也就是根类加载器加载,根类加载器找不到所有才返回让loader3加载,而loader3的加载路径D:\myapp\loader3lib下刚好有Dog.class文件,所有就加载了。


如果上面的内容有错误的地方或者讲的不好的地方,还请大家指点一下,我好及时修改。

Argoverse2数据集保姆级导入教程:从下载到预处理全流程解析 本文详细解析了Argoverse2数据集的完整导入流程,从环境配置、数据下载到预处理和高效加载策略。作为自动驾驶领域的标杆数据集,Argoverse2提供多模态传感器数据和高精地图信息,帮助研究者快速搭建数据处理流水线。文章包含实用代码示例和性能优化技巧,特别适合自动驾驶算法开发者参考。 阅读详情

相关推荐

VCU128开发板上手记:搞定100G以太网IP核与QSFP光模块的那些坑

本文详细介绍了在VCU128开发板上实现100G以太网IP核与QSFP光模块调试的实战经验。从硬件准备、IP核配置到QSFP模块控制信号处理,文章揭示了数据手册中未提及的关键细节,并提供了优化参数和压力测试方案,帮助开发者快速解决UltraScale+平台下的高速以太网部署难题。

weixin_30740295的博客 520

java父系调用子系_Java虚拟机JVM学习05 类加载器的父委托机制

Java虚拟机JVM学习05 类加载器的父委托机制类加载器类加载器用来把类加载到Java虚拟机中。类加载器的类型有两种类型的类加载器:1.JVM自带的加载器:根类加载器(Bootstrap)扩展类加载器(Extension)系统类加载器(System)2.用户自定义的类加载器:java.lang.ClassLoader的子类,用户可以定制类的加载方式。JVM自带的加载器Java虚拟机自带了以下几种...

weixin_35949435的博客 263

COMSOL后处理与可视化

公众号→【COMSOL仿真交流】←更多精彩内容 后处理是采用COMSOL建模的一个重要环节。通过软件自带的可视化工具,可以快速方便的展现仿真结果。 COMSOL为使用者提供了多种后处理工具,包括表面图、切面图、等值线图、流线图、线图、体图等等。可按功能分为数据集(储存数据的地方)、派生值和表单(对数据进行进一步的操作)、绘图组合绘图类型(显示数据结果的地方)、导出数据与生成报告。   如果想用origin、matlab对模拟数据做进一步的处理,导出excel格式的模拟结果,这可以通过“导出

midiio的博客 4027

深入理解Java类加载器(ClassLoader)

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) 本篇博文主要是探讨类加载器,同时在本篇中列举的源码都基于Java8版本,不同的版本可能有些许差异。主要内容如下 类加载的机制的层次结构 每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class"的文件,".class"文件中保存着Java代码经转换...

weixin_34228617的博客 8878

【feature_column处理】- indicator_column(指示列)和embedding_column(嵌入列)

1. 开胃菜 我们先来了解一下tf.feature_column.input_layer def input_layer(features, feature_columns, weight_collections=None, trainable=True, cols_to_vars=None, cols_to_output_tensors=None)

DataAlgo 1487

Java后端实战:钉钉互动卡片消息从配置到生产级对接

在企业级消息推送场景中,机器人通知已从简单的文本向富交互演进。其核心原理在于通过可交互的卡片模板,将传统单向通知升级为双向、有状态的微型应用界面,实现了用户无需跳转即可完成操作的技术价值。这广泛应用于审批、任务确认、数据填报等需要即时反馈的业务流程。本文聚焦于钉钉平台,深入剖析其互动卡片消息机制,并基于Java后端,系统讲解如何实现包括安全验签、异步回调与卡片动态更新在内的生产级对接方案,涵盖配置管理、服务降级等工程实践关键点,助力构建稳定高效的企业消息交互服务。

weixin_30617737的博客 435

类加载器的父亲委托机制深度详解

一、类加载器 1、父亲委托机制(Parent Delegation) 类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用父亲委托机制,这种机制能够更好的保证java平台的安全,在此委托机制中,除了Java虚拟机自带的根类加载器外,其余的类加载器都有且只有一个父类加载器。当java程序请求加载器loader加载Sample类时,loader首先委托自己的父

俺叫赵小邪的博客 5266

西门子S7-1200与FUNUC机器人MODBUS TCP通信

PLC与机器人通讯

Illusssion的博客 1万+

【类加载器】————类加载器之间的父子关系以及管辖范围【委托机制】

1、得到和修改本类的加载器 CLASSPATH指定的所有jar或目录采用AppClassLoader加载器加载 package com.xiaozhi.loader; public class LoaderTest { public static void main(String[] args) { System.out.println(LoaderTest.class.

闲着没事_玩玩JAVA的专栏 2676

APP爬虫:Airtest的使用和爬取实战详解

Airtest是一个跨平台的自动化测试工具,主要用于移动应用和游戏的UI自动化测试。它支持图像识别、触摸操作、文本输入等功能,能够模拟真实用户的操作行为。此外,Airtest还具备强大的日志记录和报告生成功能,方便开发者进行调试和分析。图像识别:通过截图匹配元素,无需依赖 UI 层次结构。跨平台支持:支持 Android、iOS 和 Windows 应用。简单易用:提供 IDE 和脚本录制功能,降低使用门槛。

数据知道的博客 9619

Sigrity OptimizePI Best Capacitor Location Estimation模式如何评估电容最佳位置操作指导

Sigrity OptimizePI Best Capacitor Location Estimation模式用于前仿真分析,评估电容的最佳位置以获得最小回路电感,如何分析,以下图为例进行说明。IC devices,输入U*, A*, B*, Q*, P*,将所有这些字母开头的器件都识别为IC。Min设置为1(最少电容个数为1),max设置为28(最多电容个数为28)Capacitors 输入C*,将所有C开头的器件都识别为电容。Grid X设置为8,Grid Y也设置为8。

weixin_54787054的博客 382

深入java虚拟机(四)类加载器的父亲委托机制

一 类加载器------ java虚拟机自带的类加载器 父子加载器并非继承关系,也就是说子加载器不一定继承了父加载器。 ------  自定义类加载器------ java虚拟机自带的类加载器之间的关系二 类加载的父亲委托机制三 创建用户自定义的类加载器...

peng_0129的博客 287

YOLOv11 改进 - 即插即用 | PST金字塔稀疏Transformer:粗粒度到细粒度推理优化特征提取,提升复杂场景适应性

本文介绍了金字塔稀疏 Transformer(PST)与 YOLOv11 的结合。主流基于注意力的特征融合方法计算复杂度高、实现难度大,作者提出 PST 模块,融合粗到细令牌选择与共享注意力参数机制,在保留空间细节的同时降低计算量。该模块通过层级化注意力机制、动态令牌选择与参数共享,实现高效多尺度特征融合

魔改工程师的博客 830

JVM中类加载器的父委托机制

类加载器   类加载器用来把类加载到Java虚拟机中。   类加载器的类型   有两种类型的类加载器:   1.JVM自带的加载器:     根类加载器(Bootstrap)     扩展类加载器(Extension)     系统类加载器(System)   2.用户自定义的类加载器:     java.lang.ClassLoader的子类,用户可以定制

乐在克里特的博客 275

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java 类加载委托机制

Java 中的类加载机制是 JVM 的核心之一,它通过将字节码加载到内存中,使得程序能够正常运行。而在这个过程中,Java 引入了一种独特的“类加载委托机制”(也称双亲委派机制),以确保类加载的稳定性与安全性。本篇文章将详细阐述这一机制的原理、实际应用及其潜在的优缺点,帮助读者深入理解这一关键概念。

猿小蔡的博客 1061

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java 让父加载器加载类_JVM中类加载器的父委托机制

类加载器类加载器用来把类加载到Java虚拟机中。类加载器的类型有两种类型的类加载器:1.JVM自带的加载器:根类加载器(Bootstrap)扩展类加载器(Extension)系统类加载器(System)2.用户自定义的类加载器:java.lang.ClassLoader的子类,用户可以定制类的加载方式。JVM自带的加载器Java虚拟机自带了以下几种加载器。1.根(Bootstrap)类加载器:该加...

weixin_32486581的博客 277

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java类加载器的委托机制

最近因为实习选择JavaWeb方向,因此开始踏实的研究下Java这门 博大精深的语言,hi

Kevin的逆袭博客 1128

java 父委托机制优点_类加载器及父亲委托机制

一、类加载器1、在Java中,有两种类型的类加载器,分别是JVM自带的类加载器和用户自定义的类加载器。2、JVM自带的类加载器有三种,如下:根(Bootstrap)类加载器:该加载器没有父加载器,它负责加载虚拟机的核心类库,如java.lang.*等。它从系统属性sun.boot.class.path所指定的目录中加载类库,它的实现依赖于底层操作系统,属于虚拟机的实现的一部分,它并没有继承java...

weixin_36289292的博客 271

jvm类加载器委托机制

Java虚拟机JVM学习05 类加载器的父委托机制   类加载器   类加载器用来把类加载到Java虚拟机中。   类加载器的类型   有两种类型的类加载器:   1.JVM自带的加载器:     根类加载器(Bootstrap)     扩展类加载器(Extension)     系统类加载器(System)   2.用户自定义的类加载器:     java.lang....

daolicloud的博客 174

jvm类加载器的父类委托机制

1. 两种类型的类加载器: (1) JVM自带的加载器 - 根类加载器(Bootstrap) 使用C++编写,程序员无法在Java代码中获得该类 - 扩展类加载器(Extension) 使用Java代码实现 - 系统类加载器(System - 应用类加载器) 使用Java代码实现 (2) 用户自定义的类加载器 - java.lang.ClassLoader的子类 - 用户可以

技术人生 4315

Java多线程相关知识【27】--类加载器(ClassLoader)--创建一个自定义加载器(父委托机制)

文章目录Java多线程相关知识【27】--类加载器(ClassLoader)--创建一个自定义加载器(父委托机制)手写一个类加载器测试我的类加载器类加载器说明:名词解释定义类加载器:实际使用加载类的加载器初始类加载器:实际使用加载器的全部父加载器父子类加载器的真实关系:包含关系父委托加载能提高系统的安全性,保证系统的安全性 菜鸟的一个学习笔记,欢迎大神批评指正。 Java多线程相关知识【27】–类...

努力的小白X 485

Java 类加载器 ClassLoader 详解与双亲委托模型

摘要 本文主要介绍 Java 类加载器的原理和应用场景。 What is ClassLoader? ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去。 为什么需要类加载器? jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。 你想啊,假如一次性全部加载项目中的所有的 jar 包,那么多class,那内存还不崩溃? 其实,我们在搭建JDK开发环...

AI天才研究院 2万+

java双亲委派机制,类加载器详解

java双亲委派机制,类加载器到分类以及作用,自定义的类名和包名与系统自带的类名重复了会发生什么

ocean&21的博客 1255

类加载器 java委托机制_java 类加载器的委托机制

l 当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?1.首先当前线程的类加载器去加载线程中的第一个类。2.如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。3.还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。l 每个类加载器加载类时,又先委托给其上级类加载器。1.当所有祖宗类加载器没有加载到类,回到发起者类加载器,...

weixin_39633781的博客 183

java 让父加载器加载类_Java虚拟机JVM学习05 类加载器的父委托机制

Java虚拟机JVM学习05 类加载器的父委托机制类加载器类加载器用来把类加载到Java虚拟机中。类加载器的类型有两种类型的类加载器:1.JVM自带的加载器:根类加载器(Bootstrap)扩展类加载器(Extension)系统类加载器(System)2.用户自定义的类加载器:java.lang.ClassLoader的子类,用户可以定制类的加载方式。JVM自带的加载器Java虚拟机自带了以下几种...

weixin_35379749的博客 130

类加载器的委托机制

与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。中文叫做类加载器。 ...

89
上一篇: Java类加载器体系探究
下一篇: GC日志查看分析
腹黑大壁花
博客等级 码龄12年 157粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值