广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java基础之ClassLoader详解
  • 523
分享到

Java基础之ClassLoader详解

2024-04-02 19:04:59 523人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、ClassLoader简介二、内置的CLassLoader的类型三、BootstrapClassLoader四、ExtClassLoader五、AppClassLoader六

一、ClassLoader简介

ClassLoader负责在运行时将Java类动态加载到JVM中,而且ClassLoader是JRE的一部分。因此,由于ClassLoader的存在,JVM无需了解底层文件和文件系统即可运行Java程序。

而且,ClassLoader并不会一次把所有Java类加载到内存中,而是在应用程序需要的时候加载。这就是ClassLoader发挥作用的地方,它们负责将类加载到内存中。

二、内置的CLassLoader的类型

下面是一个简单的例子,它展示了不同的类被哪种ClassLoader加载的:

Java中的ClassLoad

 执行上面的方法,将打印:

Java中的ClassLoad

如我们所看到的,这里有三种不同的ClassLoader:AppClassLoader、ExtClassLoader和BootstrapClassLoader。BootstrapClassLoader显示为null,这是因为BootstrapClassLoader是本机代码(由C/C++编写,本身是JRE的一部分)而不是Java代码编写的,因此不会显示为Java类。

AppClassLoader加载了上面示例方法的类(Test),AppClassLoader将我们的java类加载到类路径中。

接下来,ExtClassLoader加载了Logging类,ExtClassLoader加载作为标准核心的Java扩展类 - %JAVA_HOME%/jre/lib/ext下的类。

最后是BootstrapClassLoader加载了ArrayList类,BootstrapClassLoader是所有ClassLoader的父级。

三、BootstrapClassLoader

Java类是由java.lang.ClassLoader的实例加载的,但是AppClassLoader本身就是一个Java类。因此谁来加载AppClassLoader(java.lang.ClassLoader)?

这就是BootstrapClassLoader发挥作用的地方了。

BootstrapClassLoader负责加载jdk内部的类,rt.jar和%JAVA_HOME%/lib目录下的其他核心库,ext目录是扩展库。此外BootstrapClassLoader还是其他ClassLoader实例的爸爸。

BootstrapClassLoader是JVM的一部分,它是由本机代码(C/c++)编写,在不同的平台上会有不同的实现。

四、ExtClassLoader

ExtClassLoader是BootstrapClassLoader的子类,它负责加载标准核心的Java扩展类,它从JDK的扩展目录%JAVA_HOME%/lib/ext/目录或环境变量java.ext.dirs目录下加载对应的扩展类。

五、AppClassLoader

AppClassLoader负责将所有的应用程序级的类加载到JVM中,它加载在类环境变量CLASSPATH下的文件,而且它是ExtClassLoader的子类。

六、ClassLoader如何工作?

ClassLoader是JRE的一部分,当JVM请求一个类时,ClassLoader尝试定位该类,并使用完全限定的类名称来加载该类。

java.lang.ClassLoader.loadClass()方法时负责加载类成为运行时,它首先会尝试基于完全限定的类名称去加载类,如果没有加载到该类,它就会委派给父类ClassLoader,这个过程使用递归完成的。

最终,如果父类ClassLoader找不到该类,则子类将调用
java.net.URLClassLoader.findClass()方法在文件系统中查找该类。如果最后一个子类ClassLoader也无法加载该类,就抛出java.lang.NoClassDeFoundError或java.lang.ClassNotFoundExcrption异常。

从调用java.lang.ClassForName()开始,它首先将尝试通过父类ClassLoader加载该类,然后尝试通过
java.net.URLClassLoader.findClass()查找class本身。当让任然找不到该类是,它将抛出ClassNotFoundException异常。

ClassLoader具有三个重要的特性。

七、委托模型

ClassLoader遵循委托模型,在该模型中,根据请求查找类或者资源,ClassLoader实例会将对类或者资源的搜索委托给父级ClassLoader。

假设我们有一个应用程序类加载到JVM中的请求,AppClassLoader会将该类的加载委托给其父级ExtClassLoader,而父级ExtClassLoader又将委托给BootstrapClassLoader。

仅当BootstrapClassLoader和ExtClassLoader未能成功加载类时,AppClassLoader才会去加载类。

八、class唯一性

作为委托模型的结果,很容易确保class的唯一性,因为我们总是尝试向上委托。如果父类ClassLoader无法找到该类,则只有当前的ClassLoader实例会亲自去加载。

九、可见性

子类ClassLoader对其父类ClassLoader加载的类是可以见的。

例如,BootstrapClassLoader加载的类对ExtClassLoader加载的类具有可见性,反之亦然。

如果AppClassLoader加载了类A,ExtClassLoader加载了类B,那么就AppClassLoader加载的其他类而言,A和B都是可见的。

但是就ExtClassLoader加载其他类而言,类B是唯一可见的类。

到此这篇关于Java基础之ClassLoader详解的文章就介绍到这了,更多相关Java ClassLoader详解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java基础之ClassLoader详解

本文链接: https://www.lsjlt.com/news/124907.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java基础之ClassLoader详解
    目录一、ClassLoader简介二、内置的CLassLoader的类型三、BootstrapClassLoader四、ExtClassLoader五、AppClassLoader六...
    99+
    2022-11-12
  • Java基础之Maven详解
    目录一、Maven环境的搭建1. 为什么要学习Maven?2. Maven项目架构管理工具3. 下载安装Maven4. 配置环境变量5. 阿里云...
    99+
    2022-11-12
  • Java基础之StringBuffer详解
    目录一、前言二、用法三、结果四、长度 容量五、IStringBuffer接口六、value和capacity一、前言 StringBuffer是可变长的字符串 1.append 追加...
    99+
    2022-11-12
  • Java基础之FastJson详解
    目录一、fastJson将json格式字符串转化成List集合二、fastJson将json格式字符串转化成对象三、FastJson将对象或集合转化成json格式字符串四、FastJ...
    99+
    2022-11-12
  • Java基础之TreeMap详解
    目录一、写在前面二、定义三、成员变量四、内部类五、构造器六、成员方法一、写在前面 TreeMap的底层数据结构是红黑树,且TreeMap可以实现集合元素的排序。 所以TreeMap...
    99+
    2022-11-12
  • java基础之方法详解
    目录一、什么是方法二、方法的定义三、方法的调用四、方法的重载五、递归一、什么是方法 Java方法是语句的集合,他们在一起执行一个功能。 1.方法是解决一类问题的步骤的有序...
    99+
    2022-11-12
  • Java基础之数组详解
    目录前言二.创建数组三.数组的使用四.数组的遍历五.数组作为方法的参数六.数组相关方法Arrays前言 我们了解数组这个概念之前,我们先思考下面几个问题。 如果我们需要两个数据,那么...
    99+
    2022-11-12
  • Java基础之Object类详解
    object类的介绍 object是所有类的直接父类或者是间接父类,为什么这么说呢? 可以查询java8的API帮助文档: 可见在这样的一个类树中,所有的类的根还是Object类 ...
    99+
    2022-11-12
  • 详解Java基础之封装
    目录Java基础知识(封装)封装封装的目的 封装的好处封装的步骤封装的例子总结Java基础知识(封装) 封装 那封装是什么呢? 在面向对象程式设计方法中,封装(英语:Enc...
    99+
    2022-11-13
  • Java基础之反射详解
    目录前言一、一个需求引出反射二、反射入门三、反射原理图四、反射相关类五、反射调用优化前言 反射是我们框架的灵魂,反射也是我们框架的一个底层基石,没有反射也就没有框架,如果我们学好了反...
    99+
    2022-11-12
  • Java基础之容器Vector详解
    目录一、前言二、Vector简介三、Vector源码四、总结五、Vector遍历方式一、前言 知识补充:Arrays.copyOf函数: public static int[] ...
    99+
    2022-11-12
  • Java基础之集合Set详解
    目录一、概述二、Set的常用方法三、Set的遍历3.1增强for循环3.2 迭代器遍历一、概述 Set是Java中的集合类,提供了一种无顺序,不重复的集合。常用的子类包括HashSe...
    99+
    2022-11-12
  • Java基础总结之Thymeleaf详解
    目录一、Thymeleaf语法1.1 变量表达式${…}1.2 选择变量表达式*{…}1.3 消息表达式 #{…}1.4 链接表达式 @{…}1.5 片段表达式 ~{…}二、基本使用...
    99+
    2022-11-12
  • Java 基础之NIO 学习详解
    目录一、NIO 简介1、NIO 三大核心(1)缓冲区 Buffer(2)通道 Channel(3)Selector 选择器2、NIO 和 IO 的区别二、NIO 的 API...
    99+
    2022-11-12
  • java基础之注解示例详解
    目录定义作用注解与注释的区别JDK内置的标准注解自定义注解@Target属性定义 注解也叫原数据,它是JDK1.5及之后版本引入的一个特性,它可以声明在类、方法、变量等前面,用来对这...
    99+
    2022-11-12
  • Java基础面试题之volatile详解
    目录1、volatile保证可见性1.1、什么是JMM模型?1.2、volatile保证可见性的代码验证1.2.1、无可见性代码验证1.2.1、volatile保证可见性验证2、vo...
    99+
    2022-11-13
  • Java基础学习之接口详解
    目录概述定义格式含有抽象方法含有默认方法和静态方法含有私有方法和私有静态方法基本的实现实现的概述抽象方法的使用默认方法的使用静态方法的使用私有方法的使用接口的多实现抽象方法默认方法静...
    99+
    2022-11-13
    Java接口使用 Java接口
  • Java基础详解之内存泄漏
    目录一、什么是内存泄漏二、Java内存泄漏引起的原因三、内存泄漏的危害一、什么是内存泄漏 内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对...
    99+
    2022-11-12
  • Java基础之集合框架详解
    目录一、前言二、集合的由来?三、集合和数组的区别?四、Collection集合的功能概述?五、Collection集合存储字符串并遍历?(迭代器)六、...
    99+
    2022-11-12
  • Java基础之FileInputStream和FileOutputStream流详解
    目录一、前言二、创建流对象三、FileInputStream常用方法四、FileOutputStream常用方法五、输入输出流测试代码一、前言 FileInputStream 用于读...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作