双亲委派机制,类加载器及其工作原理

导言

Java类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将类的字节码加载到内存中,并将其转换为可执行的Java对象。类加载器在Java应用程序中起着重要的作用,它实现了动态加载类的机制,使得Java具备了灵活性和可扩展性。本文将详细介绍Java类加载器的概念、原理以及不同类型的类加载器,并提供一些示例代码。

一、类加载器的概念

类加载器是Java虚拟机用于加载类文件的一种机制。在Java中,每个类都由类加载器加载,并在运行时被创建为一个Class对象。类加载器负责从文件系统、网络或其他来源中加载类的字节码之后,jvm里就有了这个class的对象, 有了class类对象,我们就可以根据这个类对象创建实例。类加载器还负责解析类的依赖关系,即加载jk0所需的其他类。

Java虚拟机定义了三个主要的类加载器:

1.启动类加载器(Bootstrap Class Loader):也称为根类加载器,它负责加载Java虚拟机的核心类库,如java.lang.Object, java.lang.String等。启动类加载器是虚拟机实现的一部分,它通常是由本地代码C或C++实现的,不是Java类。

2.扩展类加载器(Extension Class Loader):它是用来加载Java扩展类库的类加载器。扩展类库包括javax和java.util等包,它们位于jre/lib/ext目录下。

3.应用程序类加载器(App Class Loader):也称为系统类加载器,它负责加载应用程序的类。它会搜索应用程序的类路径(包括用户定义的类路径和系统类路径),并加载类文件。

4.自定义类加载器`` custom Class Loader``开发人员可以根据需要实现的类加载器。

类加载器之间从上到下有父子关系,上层是下层的父加载器

二、类加载器的工作原理(了解)

类加载器的工作可以简化为三个步骤:

加载(Loading):根据类的全限定名(包括包路径和类名),定位并读取类文件的字节码。

链接(Linking):将类的字节码转换为可以在虚拟机中运行的格式。链接过程包括三个阶段:

验证(Verification):验证字节码的正确性和安全性,确保它符合Java虚拟机的规范。

准备(Preparation):为类的静态变量分配内存,并设置默认的初始值。

解析(Resolution):将类的符号引用(比如方法和字段的引用)解析为直接引用(内存地址)。

初始化(Initialization):执行类的初始化代码,包括静态变量的赋值和静态块的执行。

类加载器采用了双亲委派模型(Parent Delegation Model)来加载类。即当一个类加载器需要加载类时,它会首先委派给其父类加载器加载。如果父类加载器无法加载,才由该类加载器自己去加载。这种层级关系使得类加载器能够实现类的共享和隔离,提高了代码的安全性和可靠性

三、双亲委派机制图解

为什么需要双亲委派?

1. 通过双亲委派机制,可以避免类重复加载,当父加载器已经加载过某一个类时,子加载器就不会再重新加载这个类。

2. 通过双亲委派机制,可以保证类安全性。因为BootstrapClassLoader在加载的时候,只会加载JAVA_HOME中的jar核心类库,如java.lang.String,那么这个类是不会被加载。

相关推荐
尘浮生4 分钟前
Java项目实战II基于Spring Boot的高校教师电子名片系统的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·mysql·maven
南城花随雪。9 分钟前
Spring框架之单例模式 (Singleton Pattern)
java·spring·单例模式
宝贝儿好10 分钟前
【C++】C++的单例模式、跟踪内存分配的简单方法
java·开发语言·c++
编程、小哥哥12 分钟前
设计模式之单列模式(7种单例模式案例,Effective Java 作者推荐枚举单例模式)
java·单例模式·设计模式
·Lntano·远方13 分钟前
线程安全的单例模式
java·开发语言·单例模式
堕落年代18 分钟前
IDEA启动JavaEE启动控制台乱码或者jsp等页面乱码
java·java-ee·intellij-idea
极客先躯21 分钟前
高级java每日一道面试题-2024年10月31日-RabbitMQ篇-RabbitMQ中vhost的作用是什么?
java·jvm·java-rabbitmq·vhost·rabbitmq篇
苹果酱056729 分钟前
关于最新create-react-app使用react-app-rewired2.x添加webpack配置
java·开发语言·spring boot·后端·中间件
程序猿麦小七42 分钟前
基于Java Web的传智播客crm企业管理系统的设计与实现
java·开发语言·前端·企业
路口游子1 小时前
unresolved external symbol _ossl_ed25519_keymgmt_functions
java·服务器·前端