类加载器

news/2025/1/21 6:31:43/文章来源:https://www.cnblogs.com/xlxago/p/18238534

双亲委派机制

类加载器中的核心方法

loadClass

protected Class<?> loadClass(String name, boolean resolve)  throws ClassNotFoundException  
{  synchronized (getClassLoadingLock(name)) {  // First, check if the class has already been loaded  Class<?> c = findLoadedClass(name);  if (c == null) {  long t0 = System.nanoTime();  try {  if (parent != null) {  c = parent.loadClass(name, false);  } else {  c = findBootstrapClassOrNull(name);  }  } catch (ClassNotFoundException e) {  // ...}  if (c == null) {  c = findClass(name); // ...}  }  if (resolve) {  resolveClass(c);  }  return c;  }  
}

上面这段loadClass方法,就是JVM中双亲委派机制的实现。

每个类加载器会首先调用findLoadedClass(name)查看之前有没有加载过这个类。
之后先委派给自己的父类,调用父类的loadClass方法。
如果加载的任务交到了自己头上,就会调用findClass方法,去真正的加载这个类。

findClass

findClass方法中,会获取到类的字节码的二进制信息,然后调用defineClass方法,由defineClass再调用虚拟机底层的方法,将二进制字节码加载到虚拟机的内存中。

在类A代码中引用另一个类B,会使用什么类加载器来加载类B?

假设类A是由类加载器AClassLoader加载的,类A中有这样的代码:

public class A {B b;static {B b = new B();}// ...
}

那么,类B会被A的类加载器AClassLoader所加载。

这也是为什么JDBC中的DriverManager使用SPI机制加载诸如mysql的驱动时,需要获得线程上下文的类加载器再去加载。
因为DriverManager的类加载器是BootstrapClassLoader,加载路径是rt.jar,无法找到mysql驱动所在的位置。因此需要借助于线程上下文的类加载器。

JDBC中是如何使用类加载器的?

最开始的JDBC连接,需要这样编写:

Class.forName

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IceRPC之依赖注入快乐的RPC

作者引言很高兴啊,我们来到了IceRPC之依赖注入>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界。依赖注入和IceRPC了解 IceRPC (C#) 如何为依赖注入(DI)提供支持。DI作为可选功能 DI的第一条规则是:不要引入对DI的依赖。 IceRPC (C#) 将此规则放首要…

图床

表视图触发器本文来自博客园,作者:zhywyt,转载请注明原文链接:https://www.cnblogs.com/zhywyt/p/18238527

阅读习惯

本学期开始时我的阅读量大约在50小时左右,通过这一学期读电子书,我的阅读时长为200小时,大约增加了150小时,在这150小时中,我每天会抽出半个小时来读书,这其中包括课外书和娄老师推荐的书目,比方说《学会提问》、《批判性思维》,目前在书架上的书有四本,在每天坚持读书…

纯CSS+单个div实现抖音LOGO

纯CSS+单个div就能绘制抖音LOGO。 主要借助了两个伪元素实现了整体结构,借助了 drop-shadow 生成一层整体阴影。 drop-shadow 只能是单层阴影,所以另一层阴影需要多尝试。 contrast(150%) brightness(110%) 则可以增强图像的对比度和亮度,更贴近抖音LOGO的效果。纯CSS+单个d…

完美解决SqlServer2012启动报错(cannot find one or more components.Please reinstall the application。)

出现这问题的原因是,vs组件没有安装或被卸载,重新安装这个组件即可。微软官网下载忒麻烦,这里分享一下 我用夸克网盘分享了「vs shell2010安装文件.rar」链接:https://pan.quark.cn/s/0347cf062d65

web开发之浏览器扩展插件开发-chrome浏览器扩展插件开发-入门

一.起步:开始,开发一个浏览器扩展程序: 参考文档: https://developer.chrome.google.cn/docs/extensions/get-started/tutorial/hello-world?authuser=19&%3Bhl=zh-cn&hl=zh-cn1.配置文档:manifest.json 对应文件 :新建manifest.json /popup.html / icon-green.…

Docker的资源限制

目录一、什么是资源限制1、Docker的资源限制2、内核支持Linux功能3、OOM异常4、调整/设置进程OOM评分和优先级4.1、/proc/PID/oom_score_adj4.2、/proc/PID/oom_adj4.3、/proc/PID/oom_score二、容器的内存限制1、实现原理2、命令格式及指令参数2.1、命令格式2.2、指令参数3、案…

医学图像分析入门

医学图像是什么? 医学图像是反映解剖区域内部结构或内部功能的图像,它是由一组图像元素--像素(2D)或立体像素(3D)组成的。医学图像是由采样或者重建产生的离散图像,它能将数值映射到不同的空间位置上。像素所表达的具体数值是由成像设备、成像协议、影像重建以及后期加工…

【MATLAB】去除imagesc()白边

目的:在MATLAB中去除imagesc()白边,去除图片的白边,可以将图片复制到word中的表格中显得更加紧凑。 示例代码如下: figure;imagesc(sarImageNormalization);colormap jet;axis xy; set(gca,Position,[0 0 1 1]);%消除白边实验结果: 未去除白边的效果:去除白边的效果:最终…

机器学习笔记(3): 神经网络初步

神经网络应该由若干神经元组成。前面的每一个神经元都会给到一个参数,将传递的所有参数看作一个向量 \(\vec x\),那么此神经元的净输入为: \[z = x \omega + b \]其中 \(\omega\) 称为权重向量。这里认为 \(x\) 是行向量,而 \(\omega\) 是列向量。神经元还有一个激活函数 \…

配置并集集成Sentinel微服务保护

Sentinel 微服务保护的技术有很多,但在目前国内使用较多的还是Sentinel,所以接下来我们学习Sentinel的使用。 介绍和安装 Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站: https://sentinelguard.io/zh-cn/Sentinel 的使用可以分为…

设计模式:命令模式(Command Pattern)及实例

好家伙,0.什么是命令模式 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。 但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。 在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组…