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

java类加载器的父亲委托机制详细介绍

为什么80%的码农都做不了架构师?>>>   hot3.png

讲解一下ClassLoader这个类

 

java.lang.Object
  java.lang.ClassLoader

类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。

 

ClassLoader 类使用委托模型来搜索类和资源。每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader 实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机的内置类加载器(称为 "bootstrap class loader")本身没有父类加载器,但是可以将它用作 ClassLoader 实例的父类加载器。

ClassLoader 有二个构造方法:

//这个构造方法 返回 getSystemClassLoader() 返回的类加载器,就是系统类加载器。

 

protected ClassLoader()

使用方法 getSystemClassLoader() 返回的 ClassLoader 创建一个新的类加载器,将该加载器作为父类加载器。

如果存在安全管理器,则调用其 checkCreateClassLoader 方法。这可能导致安全性异常。

 

//这个带参数的构造方法,可以指定当前类的父加载器

protected ClassLoader(ClassLoader parent)

使用指定的、用于委托操作的父类加载器创建新的类加载器。

如果存在安全管理器,则调用其 checkCreateClassLoader 方法。这可能导致安全性异常。

参数:

parent - 父类加载器

 

public Class<?> loadClass(String name)
                   throws ClassNotFoundException

使用指定的二进制名称来加载类。此方法使用与 loadClass(String, boolean) 方法相同的方式搜索类。Java 虚拟机调用它来分析类引用。调用此方法等效于调用 loadClass(name, false)

 

 

参数:

name - 类的二进制名称

返回:

得到的 Class 对象 

protected Class<?> findClass(String name)
                      throws ClassNotFoundException

使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个ClassNotFoundException。

 

 

参数:

name - 类的二进制名称

返回:

得到的 Class 对象

 

Java中的类加载器主要是父亲委托机制,其中的父亲委托机制并不是继承,而是聚集。下一篇文档会解析一下ClassLoader的源码

在父亲委托机制中,各个加载器按照父子关系形成了树的结构,除了跟类加载器以为,其余的类加载器有且只有一个父加载器。

下图是一个类加载器的树形图结构,表示父亲委托机制之间的关系:

以下是一个根据上图的一个类加载过程的实例讲解:

以下图片介绍定义类加载器和初始类加载器:

类加载之间的真正的关系:

为什么要使用父亲委托机制???

命名空间:

转载于:https://my.oschina.net/mifans/blog/860606

相关文章:

  • Linux裸设备相关命令
  • JavaSE 学习参考:接口
  • CISCO路由器配置基础3
  • Photoshop中消失点(Photoshop帮助文档)
  • Selenium2+Python--等待页面元素加载(wait)
  • Swift 数据类型
  • 服务台的工作流程
  • 【深度分解】听趣拍云产品经理剖析视频基础知识(1)
  • windows server 2003 FTP服务器不能下载原因
  • 上火了
  • 干货:让你分分钟学会 JS 闭包
  • jeffcroft/html5 Two thousand twenty two
  • 11种QQ技术 ,让你成为QQ高手
  • springmvc 导出excel
  • iPad是代替笔记本和手机?还是活在夹缝中间?
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • Angular数据绑定机制
  • C# 免费离线人脸识别 2.0 Demo
  • CentOS 7 防火墙操作
  • ECS应用管理最佳实践
  • js算法-归并排序(merge_sort)
  • Making An Indicator With Pure CSS
  • mysql中InnoDB引擎中页的概念
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React Transition Group -- Transition 组件
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 给新手的新浪微博 SDK 集成教程【一】
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 面试总结JavaScript篇
  • 通信类
  • 微信开源mars源码分析1—上层samples分析
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 转载:[译] 内容加速黑科技趣谈
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # include “ “ 和 # include < >两者的区别
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #includecmath
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2.2w字)前端单元测试之Jest详解篇
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (接口自动化)Python3操作MySQL数据库
  • (论文阅读40-45)图像描述1
  • (三分钟)速览传统边缘检测算子
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原)本想说脏话,奈何已放下
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .htaccess配置重写url引擎
  • .NET企业级应用架构设计系列之开场白