理解类加载机制

article/2025/9/19 9:12:02

一般来说,我们日常的开发都是在IDE上进行的,这能让我们将更多的注意力放在业务的处理上,但是久而久之我们就忘记了其底层的实现原理。这是一把双刃剑,我们看不到底层实现,但是当有某些问题出现的时候,也只有理解了其底层原理,才能更好的解决问题。

类加载的基本原理

在完成代码的编写之后,编译器会将我们的java文件编译成对应的class文件(二进制字节码文件),而类加载器的作用便是在用到这些class的时候将其加载到JVM中,生成对应的class对象。

让我们来看看类加载的过程:

加载:加载是类加载的第一个阶段,通过类的全限定名来找到对应的class文件,将此class文件生成一个class对象。

链接:链接分为3个小部分,验证、准备、解析。

验证:验证的目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证;

准备:给静态方法和静态变量赋予初值,比如static int a;给其中的a赋予初值为0,但是这里不会给final修饰的静态变量赋予初值,因为被final修饰的静态变量在编译期间就已经被赋予初值了;

解析:主要将常量池中的符号引用替换为直接引用的过程。

初始化:类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的static变量将会在这个阶段赋值,成员变量也将被初始化。

什么是类加载器?

执行以上类加载过程的就是类加载器。系统给我们提供的类加载器有三种:启动类加载器、扩展类加载器和系统类加载器。

启动类(Bootstrap)加载器:

它是由C++实现的本。地方法,不属于Java类范畴,不能够被直接引用,主要被用于加载java所需的核心jar包,它负责将 <JAVA_HOME>/lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中,属于顶级类加载器。

扩展类(Extension)加载器:

它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库。

系统类(System)加载器:

它负责加载系统类路径java -classpath-D java.class.path 指定路径下的类库,也就是我们经常用到的classpath路径,开发者可以直接使用系统类加载器,一般情况下该类加载是程序中默认的类加载器,通过ClassLoader#getSystemClassLoader()方法可以获取到该类加载器。

说到类加载器就不得不说到其双亲委派模式,类加载器在加载类的时候如果有父加载器,会优先将加载任务委托给父类加载器执行,若父类加载还有父类加载器,则进一步委托给上层的父类加载器,直到委托给顶层类加载器(Bootstrap ClassLoader),因为顶层类加载器已经没有父类加载器了。然后由父类加载器进行类的加载,若加载失败,则逐级向下由子加载器类进行加载。

双亲委派模式的优点:

1:双亲委派模式使得类的加载有了层级优先级,通过这种层级的优先级来保证加载过的类不会被重复加载,父类已经加载过的类,子类没有必要再去加载一次。

2:其次是为了安全,比如Bootstrap ClassLoader会加载JVM需要的核心java包,这时候网络上传来了一个名字是java.lang.Integer的类,Bootstrap ClassLoader检测到该类已经被加载过了,所以直接返回Class,而不是重新加载,便可以防止核心API库被随意篡改。可能你会想到自己在classpath路径下自定义一个java.lang.myInteger类,这并不属于java核心包中,父类加载器找不到该类,所以最后交由系统类加载器加载该类。但是这样做是不允许,因为java.lang是核心API包,需要访问权限,强制加载将会报出如下异常

java.lang.SecurityException: Prohibited package name: java.lang

ClassLoader类源码解析

loadClass方法

        //加载class的方法,体现了双亲委派模式protected Class<?> loadClass(String paramString, boolean paramBoolean)throws ClassNotFoundException {//若加载失败直接抛出无法找到类的错误synchronized (getClassLoadingLock(paramString)) {Class localClass = findLoadedClass(paramString);//从缓存中查找该类是否已被加载if (localClass == null) {//若没有被加载,则开始进行加载long l1 = System.nanoTime();try {if (this.parent != null)//若该类加载器的父类加载器不为空,则委托其父类进行加载localClass = this.parent.loadClass(paramString, false);else {//若其父类加载器为null,则说明本类加载器为扩展类加载器,父类加载器为启动类加载器,尝试使用bootstrap classloader进行类的加载localClass = findBootstrapClassOrNull(paramString);}} catch (ClassNotFoundException localClassNotFoundException) {}if (localClass == null) {//若localClass为空,则父类加载器加载失败long l2 = System.nanoTime();localClass = findClass(paramString);//尝试使用自定义类加载器进行加载PerfCounter.getParentDelegationTime().addTime(l2 - l1);PerfCounter.getFindClassTime().addElapsedTimeFrom(l2);PerfCounter.getFindClasses().increment();}}if (paramBoolean) {//通过传入的标识来控制是否要对该类进行初始化操作resolveClass(localClass);//调用本地方法进行实现}return localClass;}}

ClassLoader类中的loadClass方法显示出了双亲委派模式,在类进行加载之前首先在缓存中查询是否该类已经被加载过了,如果加载过了则直接返回class对象,如果没有被加载过,则首先查看本类加载器的父类加载器是否存在,如果存在则委托父类加载器进行类的加载,如果父类加载器为null,代表子类加载器是扩展类加载器,而其父类是启动类加载器,使用委托给启动类加载器进行加载。若以上的父类没有加载成功,最后使用自定义的类加载器进行加载。

findClass方法

	protected Class<?> findClass(String paramString)throws ClassNotFoundException {throw new ClassNotFoundException(paramString);}

 findClass方法默认抛出ClassNotFoundException,子类可以通过重写findClass方法来调用自定义类加载器。

 


http://chatgpt.dhexx.cn/article/vQW7BZkg.shtml

相关文章

谈谈类加载机制

前言 类的加载其实就是将.class文件加载的jvm的内存之中。在JVM中并不是一次性把所有的文件都加载到&#xff0c;而是一步一步的&#xff0c;按照需要来加载。JVM启动时会通过不同的类加载器加载不同的类&#xff0c;而且同一个类也不可能由多个加载器来进行加载。正是这种分级…

【JVM】详解类加载机制

JVM的类加载机制 一、类的生命周期二、类加载的过程1.加载2.连接3.初始化 三、类加载器的介绍3.1 启动类加载器&#xff08;根类加载器/引导类加载器&#xff09;&#xff08;Bootstrap ClassLoader&#xff09;3.2 扩展类加载器3.3 系统类加载器 四、双亲委派模型4.1 双亲委派…

tomcat类加载机制

目录 一、JVM类加载机制简介 二、TOMCAT类加载机制 三、违反双亲委托机制 一、JVM类加载机制简介 简述JVM双亲委派模型&#xff1a; JVM中包括集中类加载器&#xff1a; BootStrapClassLoader 引导类加载器ExtClassLoader 扩展类加载器AppClassLoader 应用类加载器Custom…

JAVA类加载机制详解

上一篇文章我们简单说了一下类的创建过程&#xff0c;但是如果JVM需要加载类&#xff0c;会经过哪些具体的过程呢&#xff1f;下面我们就来谈一谈。 要了解加载类的过程&#xff0c;我们就必须要了解类加载器。 在很多初学者刚听到类加载器的时候觉得很高大上&#xff0c;其实…

Android 类加载机制

1.类加载机制 .java文件不是可执行的文件,需要先编译成.class文件才可以被虚拟机执行。而类加载就是指通过类加载器把.class文件加载到虚拟机的内存空间,具体来说是方法区。类通常是按需加载,即第一次使用该类时才加载。 Java与Android都是把类加载到虚拟机内存中,然后由…

面试题:请介绍 JVM 类加载机制

JVM 类加载机制 Java 代码执行流程类的生命周期加载验证准备解析初始化clinit 和 init 方法 类加载的时机被动引用 类加载器双亲委派机制 我们在前面分析JVM架构解析的时候&#xff0c;简单介绍了 Java 类加载机制&#xff0c;本文带大家深入分析一下。 Java 代码执行流程 根据…

Tomcat 的类加载机制

在前面 Java虚拟机&#xff1a;对象创建过程与类加载机制、双亲委派模型 文章中&#xff0c;我们介绍了 JVM 的类加载机制以及双亲委派模型&#xff0c;双亲委派模型的类加载过程主要分为以下几个步骤&#xff1a; &#xff08;1&#xff09;初始化 ClassLoader 时需要指定自己…

java类加载机制

最近开通了一个订阅号 gexiaolong 在其中记录一些关于java总是记了又忘&#xff0c;忘了又记的一些知识点&#xff0c;所以还是写一篇日志记录一下吧 老规矩&#xff0c;抄作业&#xff0c;关于java的类加载机制的问题也是看了忘&#xff0c;忘了又在看 在此梳理记录一下 说…

类加载机制详解

一、类加载机制 Java虚拟机把描述类的数据从Class文件加载进内存&#xff0c;并对数据进行校验&#xff0c;转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 虚拟机设计团队把类加载阶段中的“通过一个类的全限定…

类的加载机制

文章目录 前言类加载的生命周期&#xff1a;加载&#xff08;Loading&#xff09;、验证&#xff08;Verification&#xff09;、准备&#xff08;PreParation&#xff09;、解析(Resolution)、初始化、使用、销毁&#xff0c;其中验证&#xff0c;准备&#xff0c;解析又叫做连…

类加载机制

1、JVM 和 类 &#xff08;1&#xff09;运行java命令&#xff1a; java 带有main方法的类名 ■ 命令的作用&#xff1a;启动jvm&#xff0c;并加载字节码&#xff0c;执行程序 当调用java命令来运行某个java程序时&#xff0c;该命令将会启动一个jvm进程&#xff08;同一个…

双亲委派模型的破坏

一、类加载机制 Java虚拟机把描述类的数据从Class文件加载进内存&#xff0c;并对数据进行校验&#xff0c;转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 虚拟机设计团队把类加载阶段中的“通过一个类的全限定…

类加载机制(整个过程详解)

一:背景 类加载机制是在我们的真个java的运行阶段中的其中一个阶段。 二:什么是快乐星球(类加载机制) 我们编写的 Java 文件都是以.java 为后缀的文件&#xff0c;编译器会将我们编写的.java 的文件编译成.class 文件&#xff0c;简单来说类加载机制就是jvm从文件系统将一系…

TCP/IP四层模型---应用层

相对于OSI七层模型,TCP/IP四层模型更为简化,总结为应用层,传输层,网络层,数据链路层四层 简单来说,四层协议分别为: 协议 应用层DNS,URI,HTML,HTTP,SSL,SMTP,POP,IMAPTELNET,SSH,FTP,SNMP应用程序相关传输层TCP,UDP,UDP-Lite,SCTP,DCCP操作系统内核负责网络层ARP,IP,ICMP数据链…

OSI七层网络模型与TCP/IP四层网络模型

OSI模型&#xff0c;即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems Interconnection Reference Model)&#xff0c;是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架&#xff0c;简称OSI。 OSI网络模型按照…

TCP/IP五层(四层)模型

TCP/IP五层&#xff08;四层&#xff09;模型中包含的协议有很多&#xff0c;其中典型代表是TCP协议和IP协议。 应用层&#xff1a;应用程序直接打交道的协议。在实际开发中涉及最多的部分&#xff0c;甚至需要自己设计应用层协议。 传输层&#xff1a;负责端到端之间的传输。&…

【计算机网络】TCP/IP四层模型和OSI七层模型

文章目录 一、TCP/IP四层模型和OSI七层模型关系二、TCP/IP四层模型三、OSI七层模型四、GET和POST的区别五、从输入网址到页面展示的过程六、详细过程 一、TCP/IP四层模型和OSI七层模型关系 1、OSI引进了服务、接口、协议、分层的概念&#xff0c;TCP/IP借鉴了OSI的这些概念建立…

TCP/IP四层模型与OSI七层模型

1&#xff09;网络协议 【网络协议】是【网络上所有设备】&#xff08;网络服务器、计算机及交换机、路由器、防火墙等&#xff09;之间【通信规则】的【集合】&#xff0c;它规定了进行【网络中的对等实体数据交换】而建立的规则。由于大多数网络采用【分层的体系结构】&…

OSI七层模型和TCPIP四层网络模型

OSI七层模型和TCP/IP四层网络模型 写在文前&#xff0c;本篇文章是在学习过程抄录的笔记&#xff0c;需要更详细的内容可以在微信搜索javaguide公众号获取。1、OSI划分 七层划分&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层五层划分&#xff1a;…