首页 > 其他分享 >双亲委派模式的优点

双亲委派模式的优点

时间:2024-01-30 16:34:54浏览次数:26  
标签:委派 Extension ClassLoader System 优点 双亲 加载

一道面试题
能不能自己写个类叫java.lang.System?

答案:通常不可以,但可以采取另类方法达到这个需求。
解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统提供的System,自己写的System类根本没有机会得到加载。

但是,我们可以自己定义一个类加载器来达到这个目的,为了避免双亲委托机制,这个类加载器也必须是特殊的。由于系统自带的三个类加载器都加载特定目录下的类,如果我们自己的类加载器放在一个特殊的目录,那么系统的加载器就无法加载,也就是最终还是由我们自己的加载器加载。

双亲委派模式优势

避免重复加载 + 避免核心类篡改
采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java
API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

JVM预定义的三种类型类加载器:

  • 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将
    <Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

  • 标准扩展(Extension)类加载器:是由 Sun 的
    ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将<
    Java_Runtime_Home >/lib/ext或者由系统变量
    java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

  • 系统(System)类加载器:是由 Sun 的
    AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。

双亲委派模型工作工程:

1.当Application ClassLoader 收到一个类加载请求时,他首先不会自己去尝试加载这个类,而是将这个请求委派给父类加载器Extension ClassLoader去完成。

2.当Extension ClassLoader收到一个类加载请求时,他首先也不会自己去尝试加载这个类,而是将请求委派给父类加载器Bootstrap
ClassLoader去完成。

3.如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载。

4.如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载。

5.如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载。
在这里插入图片描述
在这里插入图片描述

这就涉及到了类的具体加载过程, 如下图, 类的加载过程被从左到右划分为 3 大阶段

1.装载 (Loading)
该阶段负责找到待加载类的二进制 class 文件, 并把它以 bytecode 的形式装载到虚拟机。 在这个过程中, JVM 会给这个类分配一个基本的内存结构, 但是方法, 变量域, 和它引用到的其他类在这个阶段都还没有处理, 也就是说, 这个类在目前阶段还不可用
2.链接 (Linking)
这个步骤又可细分为3个阶段

  • 字节码验证
    验证字节码是否是一个正确,符合规范的类字节码
  • 类准备
    为这个类定义好必须的数据结构以表示成员变量域, 方法, 以及实现的接口等等
  • 解析
    把这个类锁引用的其他类全部加载进来 , 引用的方式有如下几种:
    • 继承
    • 实现接口
    • 域变量
    • 方法定义
    • 方法中定义的本地变量

3.初始化(Initializing)
执行类中定义的静态代码块, 初始化静态变量为默认值

隐式加载 vs 显示加载
从上文类加载的详细过程可以看出, 类有两种方式被加载进来

  1. 显式加载
    程序主动调用下列类型的方法去主动加载一个类
  • classloader.loadClass( className)
  • Class.forName( className)
  1. 隐式加载
    被显式加载的类对其他类可能存在如下引用:
  • 继承
  • 实现接口
  • 域变量
  • 方法定义
  • 方法中定义的本地变量
  • 被引用的类会被动地一并加载至虚拟机, 这种加载方式属于隐式加载

参考:https://blog.csdn.net/lengxiao1993/article/details/86689331

标签:委派,Extension,ClassLoader,System,优点,双亲,加载
From: https://www.cnblogs.com/JavaYuYin/p/17997398

相关文章

  • DNS子域委派配置
    实验介绍:DNS子域委派的作用子域即为主域下的一个子域名,当一个子域的流量过大时,主域的DNS服务器可以把一个子域的查询授权给一台专门的子域服务器例如:dns3将他的子域xiannong委派给dns1,dns3受到客户端解析域名xiannong的请求时,会转发给dns1,dns1给出结果返回给dns3。和转发器类似,d......
  • 什么是真正的ChatGPT——ChatGPT的工作原理、优点和限制分析
     什么是真正的ChatGPT——ChatGPT的工作原理、优点和限制分析前言 ChatGPT是一种基于人工智能技术的智能聊天机器人,由OpenAI提供支持。它可以使用自然语言与用户进行交互,并回答各种问题。ChatGPT采用深度学习技术和大量数据来学习语言模式和上下文,并尝试在回答问题时提供......
  • Java_讨论类加载器的双亲委派机制
    双亲委派机制简而言之,当某个类加载器在接到加载请求时,优先会将任务委托给父类加载器,一直到最顶层的类加载器,如果不能成功加载,才会尝试自己加载java.lang.ClassLoaderprotectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{synchron......
  • 【外汇110】FXTM富拓外汇平台优点和缺点!
    FXTM富拓概述ForexTimeLimited(FXTM)于2011年开始运营,现已成为在线交易行业的领导者。它已发展成为一个知名品牌,使世界各地的交易者能够获得金融市场提供的机会,无论他们身在何处或拥有何种程度的金融愿望。150多个国家的超过200万客户已经开始利用FXTM富拓提供的服务,FXTM富拓在欧......
  • 自定义表单开发工具的优点是什么?
    什么是自定义表单开发工具?它的优势特点是什么?在社会化发展程度越来越高的今天,拥有功能多、性能优的自定义表单开发工具,可以助力企业提高办公协作效率,提升内部数据资源利用率,从而实现流程化办公。哪家服务商拥有丰富的低代码研发经验?流辰信息是一家专业研发低代码技术平台的服务商......
  • 简单再回顾一下前后端分离的历程,以及他的优点(有的内容是粘贴的别人的,我只用来自己学习
    我的大作业要用到python写后端代码,但是python写前端页面太够吧丑了,所以还是得学习学习Vue,在系统学习vue之前,我先回顾回顾之前学习过一小段时间的vue,以及了解一下前后端分离的好处在5年前,前后端还是几乎是不分离的,web开发中的代码尤其混杂,PHP中有JS,JSP中有JS,ASP中有JS,JS......
  • 微服务有什么优点缺点
    一、微服务的优点:1、易于开发和维护由于微服务单个模块就相当于一个项目,开发这个模块我们就只需关心这个模块的逻辑即可,代码量和逻辑复杂度都会降低,从而易于开发和维护。2、启动较快这是相对单个微服务来讲的,相比于启动单体架构的整个项目,启动某个模块的服务速度明显是要快很......
  • 一线大厂面试真题--对双亲委派的理解
    首先,简单说一下类的加载机制(如图),就是我们自己写的java源文件到最终运行,必须要经过编译和类加载两个阶段。编译的过程就是把.java文件编译成.class文件。类加载的过程,就是把class文件装载到JVM内存中,装载完成以后就会得到一个Class对象,我们就可以使用new关键字来实例化这个对象。(......
  • 企业级快速开发平台可以用在什么行业?优点多吗?
    应用专业的企业级快速开发平台可以带来什么效果?目前,低代码技术平台在很多领域都获得了广泛应用和推广,在实现高效率办公、流程化办公和数字化发展中扮演了非常重要的角色,具有举足轻重的作用。针对这个话题,现在将给大家分享关于企业级快速开发平台的优势、特点和作用,一起来看看。......
  • PGSQL(PostgreSQL)数据库基础篇:PostgreSQL 的 主要优点 、 劣势 、体系结构 、核心功
    PostgreSQL的主要优点1.维护者是PostgreSQLGlobalDevelopmentGroup,首次发布于1989年6月。2.操作系统支持WINDOWS、Linux、UNIX、MACOSX、BSD。3.从基本功能上来看,支持ACID、关联完整性、数据库事务、Unicode多国语言。4.表和视图方面,PostgreSQL支持临时表,而物化视图,可以......