当前位置: 首页 > news >正文

Java的类加载器

类加载

1、ClassLoader 用来加载 Class 文件
2、 系统内置的ClassLoader 通过双亲委托加载指定目录下的class和资源
3、 可以自定义ClassLoader 一般覆盖findClass()
4、ContextClassLoader 与线程相关,可以获取和设置,可以绕过双亲委托的机制。

三个类加载器

BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等
Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。
App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。
除了Java默认提供的三个ClassLoader之外,用户还可以根据需要定义自已的ClassLoader,而这些自定义的ClassLoader都必须继承自java.lang.ClassLoader类,也包括Java提供的另外二个ClassLoader(Extension ClassLoader和App ClassLoader)在内,但是Bootstrap ClassLoader不继承自ClassLoader,因为它不是一个普通的Java类,底层由C++编写,已嵌入到了JVM内核当中,当JVM启动后,Bootstrap ClassLoader也随着启动,负责加载完核心类库后,并构造Extension ClassLoader和App ClassLoader类加载器。

原理

ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类加载器(Bootstrap ClassLoader)本身没有父类加载器,但可以用作其它ClassLoader实例的的父类加载器。当一个ClassLoader实例需要加载某个类时,它会试图亲自搜索某个类之前,先把这个任务委托给它的父类加载器,这个过程是由上至下依次检查的,首先由最顶层的类加载器Bootstrap ClassLoader试图加载,如果没加载到,则把任务转交给Extension ClassLoader试图加载,如果也没加载到,则转交给App ClassLoader 进行加载,如果它也没有加载得到的话,则返回给委托的发起者,由它到指定的文件系统或网络等URL中加载该类。如果它们都没有加载到这个类时,则抛出ClassNotFoundException异常。否则将这个找到的类生成一个类的定义,并将它加载到内存当中,最后返回这个类在内存中的Class实例对象。

定义自已的ClassLoader

既然JVM已经提供了默认的类加载器,为什么还要定义自已的类加载器呢?
因为Java中提供的默认ClassLoader,只加载指定目录下的jar和class,如果我们想加载其它位置的类或jar时,比如:我要加载网络上的一个class文件,通过动态加载到内存之后,要调用这个类中的方法实现我的业务逻辑。在这样的情况下,默认的ClassLoader就不能满足我们的需求了,所以需要定义自己的ClassLoader。
定义自已的类加载器分为两步:
1、继承java.lang.ClassLoader
2、重写父类的findClass方法

http://www.lryc.cn/news/138488.html

相关文章:

  • Stable Diffusion web UI 部署详细教程
  • 《深度学习计算机视觉 》书籍分享(包邮送书三本)
  • 【使用 k 折叠交叉验证的卷积神经网络(CNN)】基于卷积神经网络的无特征EMG模式识别研究(Matlab代码实现)
  • 微服务 Nacos配置热部署
  • 国产调度器之光——Fsched到底有多能打?
  • LeetCode:53. 最大子数组和 - Python
  • 网站建设 之 react usestate
  • 第一讲使用IDEA创建Java工程——HelloWorld
  • BootstrapBlazor组件使用:数据注解
  • MySQL 触发器
  • DPDK主从进程模式 rte_mempool_put失败
  • ZooKeeper 的工作原理
  • 【业务功能篇73】分布式ID解决方案
  • Qt安卓开发经验技巧总结V202308
  • 【vue2】前端实现下载后端返回的application/octet-stream文件流
  • 【Java】SM2Utils(国密 SM2 工具类)
  • 『C语言入门』初识C语言
  • jira创建条目rest实用脚本
  • 红外/可见光图像配准融合
  • 更高效稳定 | 基于ACM32 MCU的编程直流电源应用方案
  • postgresql创建一个只读账户指定数据库
  • CSDN编程题-每日一练(2023-08-25)
  • 前端面试:【前端工程化】构建工具Webpack、Parcel和Rollup
  • 大型企业是否有必要进行数字化转型?
  • 05有监督学习——神经网络
  • JavaWeb_LeadNews_Day7-ElasticSearch, Mongodb
  • redux中间件理解,常见的中间件,实现原理。
  • 麒麟系统上安装 MySQL 8.0.24
  • vue 展开和收起
  • 限制立方样条(RCS)中的P for overall和P for nonlinear的计算