双亲委派机制的作用

news2024/12/23 13:13:37


类加载过程

先简单说一下java的类加载器

类加载器,顾名思义就是一个可以将Java字节码加载为java.lang.Class实例的工具。这个过程包括,读取字节数组、验证、解析、初始化等。另外,它也可以加载资源,包括图像文件和配置文件。

类从被加载到内存中开始,到卸载出内存为止。它的生命周期总共七个阶段:加载---->验证---->准备---->解析---->初始化---->使用---->卸载。

1.加载(Loading):根据类的全限定名(包括包路径和类名),定位并读取类文件的字节码。

2.链接(Linking):将类的字节码转换为可以在虚拟机中运行的格式。链接过程包括三个阶段:

(1)验证(Verification):验证字节码的正确性和安全性,确保它符合Java虚拟机的规范。

(2)准备(Preparation):为类的静态变量分配内存,并设置默认的初始值。
(3)解析(Resolution):将类的符号引用(比如方法和字段的引用)解析为直接引用(内存地址)。

3.初始化(Initialization):执行类的初始化代码,包括静态变量的赋值和静态块的执行。

而在java中类是按需加载,(一个类只会被加载一次)

1、new创建对象

2、子类加载触发父类加载

3、调用静态成员

4、通过反射动态加载


一、java有哪些类加载器?

类加载器是Java虚拟机用于加载类文件的一种机制。在Java中,每个类都由类加载器加载,并在运行时被创建为一个Class对象。类加载器负责从文件系统、网络或其他来源中加载类的字节码,并将其转换为可执行的Java对象。类加载器还负责解析类的依赖关系,即加载所需的其他类。

Java虚拟机定义了三个主要的类加载器:

启动类加载器(Bootstrap Class Loader):也称为根类加载器,它负责加载Java虚拟机的核心类库,如java.lang.Object等。启动类加载器是虚拟机实现的一部分,它通常是由本地代码实现的,不是Java类。

扩展类加载器(Extension Class Loader):它是用来加载Java扩展类库的类加载器。扩展类库包括javax和java.util等包,它们位于jre/lib/ext目录下。

应用程序类加载器(Application Class Loader):也称为系统类加载器,它负责加载应用程序的类。它会搜索应用程序的类路径(包括用户定义的类路径和系统类路径),并加载类文件。

除了这三个主要的类加载器,Java还支持自定义类加载器,开发人员可以根据需要实现自己的类加载器。

如下是一个案例,代码中中parents和classLoader1 它的类加载器都是null,这是因为他们的类加载器都是Bootstrap Class Loader,而Bootstrap Class Loader是用C写的,在java无法识别。显示为null。

public class a {
    public static void main(String[] args) {

        // AppClassLoader@63947c6b
        ClassLoader classLoader = a.class.getClassLoader();
        System.out.println("类a的classLoader:"+classLoader);

        // PlatformClassLoader@5f205aa
        ClassLoader parent = classLoader.getParent();
        System.out.println("类a的父类classLoader:"+parent);

        // null
        ClassLoader parents = parent.getParent();
        System.out.println("类a的父类classLoader:"+parents);
        
        // null
        ClassLoader classLoader1 = String.class.getClassLoader();
        System.out.println("String字符串的classLoader:"+classLoader1);

    }
}

类a的classLoader:jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
类a的父类classLoader:jdk.internal.loader.ClassLoaders$PlatformClassLoader@5f205aa
类a的父类classLoader:null
String字符串的classLoader:null

二、双亲委派机制

自定义String类

我自己定义了一个String的类,如果我创建了这个类。那么肯定是会打印123的。(该类在我的java.lang目录下)

package java.lang;

/**
 * Description:
 *
 */
public class String {

    public String() {
        System.out.println("123");
    }
}


然后我又创建了一个A类,在这个main方法中new了一个String对象。

public class a {
     public static void main(String[] args) {
       java.lang.String a=new java.lang.String();
        System.out.println(a);
    }
}

按我们正常逻辑是不是会打印123,并且创建这个String对象。 但是结果并没有进行,创建的还是我们jdk中java.lang包下的String对象,而不是我们定义的String对象。 为什么会这样,这就涉及到我们的jvm的双亲委派机制了。

这是"java.lang"包下的ClassLoader类的底层源码。然后将代码翻到loaderClass()方法处:

 public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }
    //              -----??-----
    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
            // 首先,检查是否已经被类加载器加载过
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try {
                    // 存在父加载器,递归的交由父加载器
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        // 直到最上面的Bootstrap类加载器
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
 
                if (c == null) {
                    // 如果仍然没有找到,则依次调用findClass方法
                    // to find the class.
                    c = findClass(name);
                }
            }
            return c;
    }

这段代码是这样的

当我们启动类加载器加载String对象时,它首先会去加载当前加载器的父类去加载,一直到Bootstrap Class Loader启动类加载器。

启动类加载器(Bootstrap Class Loader):负责加载包名为java、javax、sun等开头的类。

扩展类加载器(Extension Class Loader):负责加载位于jre/lib/ext目录下的类。

应用程序类加载器(Application Class Loader):一般类都由它来加载

头像

这种设计有个好处是,如果有人想替换系统级别的类:String.java。篡改它的实现,在这种机制下这些系统的类已经被BootstrapClassLoader加载过了(为什么?因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),所以其它类加载器并没有机会再去加载,从一定程度上防止了危险代码的植入。


总结

双亲委派的作用:

1.防止重复加载同一个.class:通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。

2.保证核心的.class不能被篡改:通过委托方式,不会去篡改核心.clsas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/974615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

喜讯!Cancer Res(IF:11.2)发表胃癌PICH的转录调控机制

2023年8月30日&#xff0c;兰州大学第二医院焦作义教授团队在肿瘤学Top期刊Cancer Research&#xff08;IF:11.2&#xff09;发表“PICH activates Cyclin A1 transcription to drive S-phase progression and chemoresistance in gastric cancer”的研究论文。该研究鉴定了SNF…

框架分析(9)-Hibernate

框架分析&#xff08;9&#xff09;-Hibernate 专栏介绍Hibernate特性对象关系映射&#xff08;ORM&#xff09;数据库连接和事务管理查询语言&#xff08;HQL&#xff09;缓存机制透明的持久化操作对象的延迟加载事务管理 优缺点优点简化数据库操作跨数据库平台高度可定制性缓…

设置 Hue Server 与 Hue Web 界面之间的会话超时时间

设置 Hue Server 与 Hue Web 界面之间的会话超时时间 在 CDH 的 Hue 中&#xff0c;Auto Logout Timeout 参数表示用户在不活动一段时间后将自动注销&#xff08;登出&#xff09;的超时时间。当用户在 Hue 中处于不活动状态超过该设定时间时&#xff0c;系统将自动注销用户&am…

深度学习入门教学——代价敏感学习

1、背景 常用于分类器性能评估的指标为&#xff1a;准确率或错误率&#xff0c;也就是代价不敏感学习。【注】代价&#xff1a;一个类别被错误分类到其他类别的惩罚&#xff08;也称为权重&#xff09;。代价不敏感学习的前提是&#xff1a; 不同类的误分类代价相同。用于学习…

【力扣周赛】第 112 场双周赛

文章目录 竞赛链接Q1&#xff1a;7021. 判断通过操作能否让字符串相等 IQ2&#xff1a;7005. 判断通过操作能否让字符串相等 II&#xff08;贪心&#xff09;Q3&#xff1a;2841. 几乎唯一子数组的最大和竞赛时代码——滑动窗口 Q4&#xff1a;8050. 统计一个字符串的 k 子序列…

小白学go基础05-变量声明形式

和Python、Ruby等动态脚本语言不同&#xff0c;Go语言沿袭了静态编译型语言的传统&#xff1a;使用变量之前需要先进行变量的声明。 变量声明形式使用决策流程图 这里大致列一下Go语言常见的变量声明形式&#xff1a; var a int32 var s string "hello" var i 13 …

C# void 关键字学习

C#中void关键字是System.Void的别名&#xff1b; 可以将 void 用作方法&#xff08;或本地函数&#xff09;的返回类型来指定该方法不返回值&#xff1b; 如果C&#xff03;方法中没有参数&#xff0c;则不能将void用作参数&#xff1b;这是与C语言不同的&#xff0c;C语言有…

附录2-将三国演义按章节存储为不同的txt(bs4)

地址 《三国演义》全集在线阅读_史书典籍_诗词名句网 目录 1 项目分析 2 代码 1 项目分析 我们可以在首页中找到所有的章节 每一个章节是一个a标签&#xff0c;a标签连接到该章节的内容 但这个网站他有bug&#xff0c;章节都是乱套的&#xff0c;我们无视这种错误&#…

Python通过Socket操作RFID设备-盘点功能

项目介绍&#xff1a;根据这么多年的IT经验&#xff0c;需求通过与用户沟通发现的&#xff0c;机会也是这样出来的。仓库的小伙子跟我倒苦水&#xff0c;动不动实物盘点&#xff0c;几千颗物料&#xff0c;都忙疯了&#xff0c;而且&#xff0c;新的物料一入库&#xff0c;作为…

基于Matlab分析的电力系统可视化研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

什么是专线网络?互联网专线为什么贵

宽带主要分为专线和家庭宽带。一般来说&#xff0c;企业服务器和云服务提供商通常使用专线宽带&#xff0c;普通家庭接入家庭宽带。 什么是专线网络&#xff1f; 专线是指依托国内骨干网络和宽带城市网络资源&#xff0c;为企业集团客户提供专线接入方式互联网城市互联网&…

WebDAV之π-Disk派盘 + 无忧日记

无忧日记,生活无忧无虑。 给用户专业的手机记录工具,用户可以很轻松地通过软件进行每天发生事情的记录,可以为用户提供优质的工具与帮助,用户还可以通过软件来将地理位置,天气都记录在日记上,用户也可以通过软件来进行图片的导入,创建长图日记, 心情报表:用户写日记…

企业架构LNMP学习笔记14

默认官方模块&#xff1a; Gzip压缩&#xff1a; 压缩文件&#xff0c;使文件变小了&#xff0c;传输更快了&#xff0c;目前大部分市场浏览器都支持Gzip。 传输的时候省流量。 目的是为了提高用户的加载速度。 #开启gzip压缩 gzip on; #http协议版本 gzip_http_version 1.0…

css之层叠上下文

之前调元素的显示优先级时&#xff0c;只会默默的调z-index以达到效果&#xff0c;但有时不生效&#xff0c;又不知道根因。刚好详细了解到层叠上下文&#xff0c;可以解释此类问题。 什么是层叠上下文&#xff1f; 在CSS2.1规范中&#xff0c;每个盒模型的位置是三维的&…

智能电网时代:数字孪生的崭露头角

随着科技的不断进步&#xff0c;数字孪生已经开始在电力行业崭露头角&#xff0c;为这个关键的行业带来了前所未有的机遇和潜力。本文就带大家了解一下数字孪生在哪些方面为电力行业做出改变&#xff0c;以及未来的创新应用。 首先&#xff0c;数字孪生可以提高电力系统运营效率…

Mysql事务及锁

一、MVCC原理 1.1 版本链 trx_id &#xff1a;每次一个事务对某条聚簇索引记录进行改动时&#xff0c;都会把该事务的 事务id 赋值给 trx_id 隐藏列。 roll_pointer &#xff1a;每次对某条聚簇索引记录进行改动时&#xff0c;都会把旧的版本写入到 undo日志 中&#xff0…

木棒切割问题

题目很简单&#xff0c;就是我们在写二分的时候&#xff0c;会遇到这样的情况&#xff1a; mid left (right-left)/2; if (nums k)return mid;if (nums>k)left mid;if (nums<k)right mid-1; 若我们debug会发现其可能会一致卡在left mid&#xff0c;例如&#xff08…

ceph Monitor原理和代码流程介绍

Monitor介绍 Monitor在Ceph集群中扮演管理者的角色&#xff0c;维护了整个集群的状态&#xff0c;集群的状态被抽象成几个Map对象&#xff0c;包括monmap、osdmap、mdsmap、authmap、logmap等&#xff0c;保证集群的相关组件在同一时刻能够达成一致&#xff0c;相当于领导层。…

语言深入理解指针(非常详细)(三)

目录 数组名的理解使用指针访问数组 一维数组传参的本质二级指针指针数组指针数组模拟二维数组 数组名的理解 在上⼀个章节我们在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这里我们使用 &am…

医者无疆 | AI赋能大医精诚,医疗制药的进阶与突破

在历史的长河中&#xff0c;医学一直是人类文明的重要组成部分。从古希腊的希波克拉底到现代医学研究&#xff0c;医学始终与时俱进&#xff0c;为人类的健康和福祉做出了巨大的贡献。在互联网、大数据、5G等信息技术的迭代下&#xff0c;人工智能&#xff08;AI&#xff09;的…