首页 > 其他分享 >双亲委派机制以及类加载过程就是这样啊

双亲委派机制以及类加载过程就是这样啊

时间:2024-10-18 19:19:42浏览次数:9  
标签:委派 自定义 应用程序 双亲 加载 进行

类加载过程:

简洁来说就是将我们的已经完成编译的class字节码文件通过类加载器到我们JVM的内存运行时数据区成为我们可以在程序中可以使用的class对象,而类加载器就是通过双亲委派机制来实现的,这个也是反射的底层实现的原因

具体流程:  加载 链接 初始化

加载: 就是通过类加载器以及实现的双亲委派机制加载到JVM内存的运行时数据区

链接:这个过程里面分为验证 准备 解析

        验证: 来确定这个类是否符合JVM的一些规范就是一个安全性的考虑

        准备:对类里面的静态变量完成初始化 如里面的String类型的赋值为null int赋值为0等等

        解析:就是对类中的修饰符进行一个解析的过程

初始化: 实现类中静态变量实现一个真正的赋值简洁来说根据实际的赋值来进行赋值

类加载器的类别:

1.根类加载器(BootStrap ClassLoader), 主要负责加载jre/lib/rt.jar相关的字节码文件的。

2.扩展类加载器(Extension ClassLoader), 主要负载加载 jre/lib/ext/*.jar 这些jar包的。

3.应用程序类加载器(Application ClassLoader), 主要负责加载用户自定义的类以及classpath环境变量所配置的jar包的。

4.自定义类加载器(UserClassLoader), 负责加载程序员指定的特殊目录下的字节码文件的。大多数情况下,自定义类加载器只需要继承ClassLoader这个抽象类,重写findClass()和loadClass()两个方法即可。

这三个类加载器是通过parent属性进行关系的联络的,但是根类记载器由于是C++来进行的所以为null

双亲委派机制: 

就是当类加载器接受到类加载请求的时候不是自己进行加载而是会向上进行一个委派(也就是让父类加载器进行加载),然后以此进行类推直到根类加载器,然后根类记载器进行尝试加载如果能加载成功的话那么就直接进行加载,如果加载失败的话那么就让其的子类记载器进行加载如果没有自定义类加载器的话那么就应用程序类加载器进行加载

优点: 1.保护Java中的核心API 2.实现避免类的重复加载

破坏双亲委派机制:

原因(缺点):双亲委派机制具有一定的局限性,如果一个类在一个类加载器里面进行加载过之后那么就会使得如果出现相同的全限类名的类的话那么就会在这个类加载器都会进进行加载
案例:
1.Tomcat: 
问题:

Tomcat可以启动多个web应用程序那么这个里面就会出现全限类名相同的类.这个就会导致不同的web应用程序使用的类加载器是同一个类加载器,但是不同的web应用程序其使用的第三方类库的版本号如 mysql,spring等等版本不一致那么就会造成一个版本冲突的问题

解决方案:

Tomcat就为每一个web应用程序自定义一个类加载器(Web类加载器),然后由自定义的类加载器进行类的加载

2.JDBC: 

JDBC中DriveMange类的class位于根加载器,那么进行加载的时候就会使用根类加载器进行一个加载

问题:

但是通过下图可以看出这个是要加载所有实现Drive接口类但是这些类都是位于classPath路径下面的如果是遵循双亲委派机制的是不可能实现的

解决方案:

通过线程上下文类加载器(默认是应用程序性类加载器)进行类的加载破坏双亲委派

我们深入到ServiceLoader.load方法就可以看到:

public static <S> ServiceLoader<S> load(Class<S> service) {
    //获取线程上下文类加载器
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    return ServiceLoader.load(service, cl);
}

标签:委派,自定义,应用程序,双亲,加载,进行
From: https://blog.csdn.net/2201_75397629/article/details/142991914

相关文章

  • ArkWeb页面加载与浏览记录导航 - 基础操作
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。简介在ArkWeb框架中,页面加载和浏览记......
  • ROS2安装turtlebot4机器人,运行ign gazebo仿真加载机器人模型(用于评测catorgrapher算法
    前言本人最近做了一个任务,需要评测catorgrapher算法的精度,这个过程中需要使用到ros2仿真过程中机器人的真实轨迹和估计轨迹,在/odom和/sim_ground_true_pose话题中提取到机器人的真实轨迹,同时改变catorgraper的源码,在启动catorgraper算法后产生tum格式轨迹文件,最后使用evo进行......
  • 微信小程序 触底加载更新 虚拟列表渲染
    <wxsmodule='filter'>varincludesList=function(list,currentIndex){if(list){returnlist.indexOf(currentIndex)>-1}}module.exports.includesList=includesList;</wxs><scroll-viewstyle='......
  • dockerfile中nuget源加载失败Retrying 'FindPackagesByIdAsync' for source 'xxx'
    问题描述:最近jenkins打包总是提示微软源加载不到Retrying'FindPackagesByIdAsync'forsource'https://api.nuget.org/v3-flatcontainer/microsoft.extensions.primitives/index.json'.Anerroroccurredwhilesendingtherequest.解决方案:dockerfile中添加国内源,改用华......
  • ProTable 如何做到下拉滚动加载数据
    1、这里主要是什么呢这里的关键是$('.ant-table-body').on('scroll',handleScrollEvent);监听滚动条事件。1、然后再reuqest里面设置,是因为ProTable点击查询时,会进到这里。2、监听page,是当滚动导致页数,发生变化时,重新加载数据!importReact,{useRef,useEffect,useState......
  • 当 smartcardsimulator.dll 加载错误时的解决策略
    smartcardsimulator.dll文件通常与智能卡模拟器或智能卡相关的应用程序有关。智能卡模拟器是一种软件工具,用于模拟智能卡的行为,以便开发人员测试和调试智能卡应用。smartcardsimulator.dll文件负责处理智能卡模拟的相关功能。当您看到“smartcardsimulator.dll加载错误”......
  • 2024-10-16 前端图片加载方式优化(webp)
    把上传的图片文件格式转化为webp图片格式。前置条件:图片文件存在阿里云oss。阿里云的对象存储服务(OSS)支持在URL中直接指定图片处理参数,这样可以在不下载原始图片到服务器的情况下,直接由OSS服务端处理图片。假设你有一张存在阿里云的图片链接,那么只需要在该链接的末尾加上?x......
  • python批处理,一键打开vscode窗口,分别加载jeecg前后端项目,并运行前后端服务.
    importsubprocess#VsCode打开后端项目cmd1=["code","D:\pro\JeecgBoot-v3.7.1\jeecg-boot"]process1=subprocess.Popen(cmd1,stdout=subprocess.PIPE,shell=True)output1,_=process1.communicate()print(output1.decode('utf-8')......
  • 关于Gmap.Net在WPF中的运用笔记(一)初步加载高德地图
    一、前言最近公司需要开发一个车辆在途轨迹追踪的软件,结合现有系统和技术体系,最终敲定使用WPF+Gmap.Net来实现,这里将一些坑踩一下,做个笔记记录一下。二、项目搭建本项目基于.Net6.0+Gmap.Net.Core+Gmap.Net.WinPresentation,前面是用到的框架版本,后面则是需要用到的地图包,可通......
  • 优化el-popover在列表等地方使用时,会大量渲染,造成页面首次加载卡顿、加载时间长的问题
    vue2项目中,在列表等需要循环渲染的地方,使用el-popover时,数据量大了以后,会造成页面卡顿。解决方案:基于el-popver二次封装 <template><divclass="my-popover-container"><spanref="referenceRef"class="comp-reference"@click="triggerPop"......