JVM工作原理与实战(十):类加载器-Java类加载器

专栏导航

JVM工作原理与实战

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、介绍

二、扩展类加载器

三、通过扩展类加载器去加载用户jar包

1.放入/jre/lib/ext下进行扩展

2.使用参数进行扩展

四、应用程序类加载器

总结


前言

​JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了扩展类加载器、通过扩展类加载器去加载用户jar包、应用程序类加载器等内容。 ​


在Java虚拟机(JVM)中,类加载器负责将类的字节码文件加载到内存中,并生成对应的Class对象。类加载器是Java虚拟机中的重要组成部分,其中Java代码实现的类加载器包括扩展类加载器和应用程序类加载器(JDK8及之前的版本)。

一、介绍

扩展类加载器和应用程序类加载器是JDK中提供的、使用Java编写的类加载器。它们是sun.misc.Launcher的静态内部类,并继承自URLClassLoader。这两个类加载器具备通过目录或指定jar包将字节码文件加载到内存中的能力。此外,它们还提供了更多的功能和灵活性,以支持Java应用程序的动态类加载需求。

ClassLoader抽象类,定义了类加载器的具体行为模式,通过JNI调用底层的Java虚拟机方 法。
SecureClassLoader使用证书机制提升类加载的安全性。
URLClassLoader利用URL获取目录下或者指定的jar包进行加载,获取其字节码数据。

扩展类加载器

Extension

加载Java安装目录/jre/lib/ext下的类文件。

应用程序类加载器

Application

加载classpath下的类文件。

二、扩展类加载器

扩展类加载器(Extension Class Loader)是JDK中提供的一个功能强大的类加载器,它使用Java语言编写,用于加载Java安装目录/jre/lib/ext下的类文件。该加载器继承自Java的URLClassLoader类,具有高度的灵活性和可扩展性,能够根据需要动态地加载和卸载类文件,从而满足Java应用程序的多样化需求。

ClassLoader提供了许多方法来动态加载类,如loadClass()、defineClass()等。这些方法允许程序员在运行时动态地加载类的字节码文件,并生成对应的Class对象。

案例:

获取扩展类加载器:

public class ExtClassLoaderDemo {public static void main(String[] args){ClassLoader classLoader = ScriptEnvironment.class.getClassLoader();System.out.println(classLoader);}
}

运行结果:

三、通过扩展类加载器去加载用户jar包

通过将所需的jar包放入/jre/lib/ext目录下和使用参数进行扩展两种方法,开发者可以利用扩展类加载器来加载用户提供的JAR包。在使用时,请根据具体情况选择最适合的方式,并注意避免可能出现的冲突和问题。

1.放入/jre/lib/ext下进行扩展

一种直接的方法是将所需的jar包放入/jre/lib/ext目录下,让扩展类加载器能够加载到这个jar包中的类。尽管这种方法能够使 JAR 包被类加载器加载,但并不推荐。主要原因是这涉及到更改 JDK 安装目录中的内容,可能会引发不可预测的问题,也可能影响到 JDK 的升级。

2.使用参数进行扩展

推荐,使用-Djava.ext.dirs=jar包目录进行扩展。这种方式可以加载用户提供的 JAR 包,但是会覆盖原始目录。所以在Windows上,可以使用分号(;)来分隔多个目录,在MacOS和Linux上,可以使用冒号(:)来分隔多个目录。

案例:

加载jar包(省略用户JAR包打包步骤):

public class Demo2 {public static void main(String[] args) throws ClassNotFoundException {Class<?> aClass = Class.forName("com.rye.test.Test");System.out.println(aClass);ClassLoader classLoader = aClass.getClassLoader();System.out.println(classLoader);
//        验证没有覆盖原始目录ClassLoader loader = ScriptEnvironment.class.getClassLoader();System.out.println(loader);}
}

使用-Djava.ext.dirs=jar包目录进行扩展:

-Djava.ext.dirs=jar包目录
-Djava.ext.dirs="D:\Java\jdk1.8.0_201\jre\lib\ext;D:\Test"

运行结果:

四、应用程序类加载器

应用程序类加载器(Application Class Loader)也是JDK中提供的、使用Java编写的类加载器。它的主要任务是加载应用程序的classpath下的类文件。

案例:

获取应用程序类加载器:

public class AppClassLoader {public static void main(String[] args) {// 该项目创建的Student类Student student = new Student();ClassLoader classLoader = Student.class.getClassLoader();System.out.println(classLoader);// maven依赖中的类ClassLoader classLoader1 = FileUtils.class.getClassLoader();System.out.println(classLoader1);}
}

运行结果:


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了扩展类加载器、通过扩展类加载器去加载用户jar包、应用程序类加载器等内容,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 每日一题 2024/1/1-2024/1/7

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 1/1 1599. 经营摩天轮的最大利润1/2 466. 统计重复个数1/3 2487. 从链表中移除节点1/4 2397. 被列覆盖的最多行数1/5 1944. 队列中可以看到的人数1/6 2807. 在链表中插入最…

Python——运算符

num 1 num 1 print("num1:", num) num - 1 print("num-1:", num) num * 4 print("num*4:", num) num / 4 print("num/4:", num) num 3 num % 2 print("num%2:", num) num ** 2 print("num**2:", num) 运行结果…

实验五:动态路由配置

实验五&#xff1a;动态路由配置 1.RIP 配置 【实验名称】 RIP 路由协议配置 【实验目的】掌握路由器 RIP 路由协议的基本配置 【实验设备】路由器&#xff08; 2 台&#xff09;、计算机&#xff08; 2 台&#xff09;、配置电缆&#xff08; 1 根&#xff09;、 V…

【Linux Shell】10. 函数

文章目录 【 1. 函数的定义 】【 2. 函数参数 】 【 1. 函数的定义 】 所有函数在使用前必须定义 。这意味着必须将函数放在脚本开始部分&#xff0c;直至shell解释器首次发现它时&#xff0c;才可以使用。 调用函数仅使用其函数名即可 。 函数返回值在调用该函数后通过 $? 来…

laravel getQueryLog() time 代表什么

laravel中的getQueryLog()方法返回了执行的所有查询的详细信息&#xff0c;包括查询语句、绑定的参数和查询的执行时间等。其中&#xff0c;time字段代表了每个查询的执行时间&#xff0c;以毫秒为单位。 以下是一个示例代码&#xff0c;演示了如何使用getQueryLog()方法获取查…

我的阿里云服务器被攻击了

服务器被DDoS攻击最恶心&#xff0c;尤其是阿里云的服务器受攻击最频繁&#xff0c;因为黑客都知道阿里云服务器防御低&#xff0c;一但被攻击就会进入黑洞清洗&#xff0c;轻的IP停止半小时&#xff0c;重的停两个至24小时&#xff0c;给网站带来很严重的损失。而处理 ddos 攻…

华为ipv4+ipv6双栈加isis多拓扑配置案例

实现效果&#xff1a;sw1中的ipv4和ipv6地址能ping通sw2中的ipv4和ipv6地址 R2-R4为存IPV4连接&#xff0c;其它为ipv6和ipv4双连接 sw1 ipv6 interface Vlanif1 ipv6 enable ip address 10.0.11.1 255.255.255.0 ipv6 address 2001:DB8:11::1/64 interface MEth0/0/1 inter…

AIGC(MLLM、VLM、LLM、SD)系列——论文解读目录

涉及面广:多模态生成模型——MLLM ( 目前集中在视觉语言模型——VLM)、大语言模型——LLM、生成模型(SD系列)、对比学习的经典模型(CLIP系列)。 持续更新:对于已经完成解读的会附上链接(有的会在一些场景做尝试,也会附上链接供大家快速参考结果),准备写的会备注筹…

K8S学习指南(70)-K8S中的informa机制

引言 在 Kubernetes 集群中&#xff0c;Informer 是一种重要的机制&#xff0c;用于监控和处理集群中资源对象的变化。它是基于观察者模式设计的&#xff0c;允许开发者注册对某类资源对象的关注&#xff0c;并在对象发生变化时得到通知。本文将深入介绍 Kubernetes 中的 Info…

Pytorch:torch.nn.Module

torch.nn.Module 是 PyTorch 中神经网络模型的基类&#xff0c;它提供了模型定义、参数管理和其他相关功能。 以下是关于 torch.nn.Module 的详细说明&#xff1a; 1. torch.nn.Module 的定义&#xff1a; torch.nn.Module 是 PyTorch 中所有神经网络模型的基类&#xff0c;…

Java课程设计团队博客 —— 基于网页的时间管理系统

博客目录 1.项目简介2.项目采用的技术3.功能需求分析4.项目亮点5.主要功能截图6.Git地址7.总结 Java团队博客分工 姓名职务负责模块个人博客孙岚组长 资源文件路径和tomcat服务器的相关配置。 前端的页面设计与逻辑实现的代码编写。 Servlet前后端数据交互的编写。 用户登录和…

java Servlet体育馆运营管理系统myeclipse开发mysql数据库网页mvc模式java编程计算机网页设计

一、源码特点 JSP 体育馆运营管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用serlvetdaobean&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。 java Servlet体育馆运营管理系…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第六天-Linux信号(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

910b上跑Chatglm3-6b进行流式输出【pytorch框架】

文章目录 准备阶段避坑阶段添加代码结果展示 准备阶段 配套软件包Ascend-cann-toolkit和Ascend-cann-nnae适配昇腾的Pytorch适配昇腾的Torchvision Adapter下载ChatGLM3代码下载chatglm3-6b模型&#xff0c;或在modelscope里下载 避坑阶段 每个人的服务器都不一样&#xff0…

vue3 封装一个Tooltip 文字提示组件

效果图 默认展示icon图标&#xff0c;悬浮展示文字 如果slot有内容则展示对应内容 实现 用的是El-Tooltip组件 Element - The worlds most popular Vue UI framework 组件代码 <script setup lang"ts"> import { Icon } from /components/Icon import { ElTo…

Linux set命令教程:如何优雅地设置和取消shell变量和选项(附实例详解和注意事项)

Linux set命令介绍 set命令是Linux操作系统中的内置shell命令&#xff0c;用于设置和取消shell变量和选项。它常用于shell脚本中&#xff0c;以配置环境并控制脚本的行为。 Linux set命令适用的Linux版本 set命令在所有主流的Linux发行版中都可以使用&#xff0c;包括但不限…

【Leetcode】238.除自身以外数组的乘积

一、题目 1、题目描述 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度内完成…

超维空间M1无人机使用说明书——21、基于opencv的人脸识别

引言&#xff1a;M1型号无人机不仅提供了yolo进行物体识别&#xff0c;也增加了基于opencv的人脸识别功能包&#xff0c;仅需要启动摄像头和识别节点即可 链接: 源码链接 一、一键启动摄像头和人脸识别节点 roslaunch robot_bringup bringup_face_detect.launch无报错&#…

Java解决动态口令问题

Java解决动态口令问题 01 题目 某公司门禁密码使用动态口令技术。初始密码为字符串 password&#xff0c;密码更新均遵循以下步骤&#xff1a; 设定一个正整数目标值 target将 password 前 target 个字符按原顺序移动至字符串末尾 请返回更新后的密码字符串。 示例 1&…

Django配置日志系统的最佳实践

概要 日志是跟踪应用行为、监控错误、性能分析和安全审计的重要工具。在Django框架中&#xff0c;合理配置日志系统可以帮助开发者有效管理项目运行过程中的关键信息。本文将详细介绍Django日志系统的最佳实践。 日志系统概述 Django使用Python的 logging 模块来实现日志系统…