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

JVM学习-自定义类加载器

为什么要自定义类加载器
  • 隔离加载类
  • 在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境,如Tomcat这类Web应用服务器,内部自定义了好几种类加载器,用于隔离同一个Web应用服务器上的不同应用程序
  • 修改类加载的方式
  • 类的加载模型并非强制,除Bootstrap外,其他的加载并非一定要引入,根据实际情况在某个时间点进行按需进行动态加载
  • 扩展加载源
  • 比如从数据库、网络、甚至是电视机机顶盒进行加载
  • 防止源码泄露
  • Java代码容易被编译和篡改,可以进行编译加密,那么类加载也需要自定义,还原加密的字节码
常见的场景
  • 实现类似进程内隔离,类加载器实际上用作不同的命名空间,以提供类似容器、模块化的效果,如两个模块依赖于某个类库的不同版本,如果分别被不同的容器加载,就可以互不干扰,这个方面集大成者是JavaEE和OSGI,JPMS等框架
  • 应用需要从不同的数据源获取类定义信息,如网络数据源,而不是本地文件系统,或者是需要自己操纵字节码,动态修改或生成类型
注意
  • 在一般情况下,使用不同的类加载器去加载不同的功能模块,会提高应用程序的安全性,但是如果涉及Java类型转换,则加载器类反而容易产生不美好的事情,在做Java类型转换时,只有两个类型都是由同一个加载器所加载,才能进行类型转换,否则转换时会发生异常
类加载器
实现方式
  • Java提供了抽象类java.lang.ClassLoader,所有用户自定义的类加载器都应该继承ClassLoader类
  • 在自定义ClassLoader的子类时,我们常见有两种做法
  • 重写loadClass()方法
  • 重写findClass()方法–>推荐
对比
  • 不建议直接修改loadClass(),而是在findClass里重写自定义类的加载方法,根据参数指定类的名字,返回对应的Class对象引用
  • loadClass()这个方法是实现双亲委派模型的地方,擅自修改这个方法会导致模型被破坏,容易造成问题,因此我们最好是在双亲委派模型框架下进行小范围的改动,不破坏原有的稳定结构,同时,也避免了自己重写loadClass方法的过程中必须写双亲委托的重复代码,从代码的复用性来看,不直接修改这个方法始终是比较好的选择
  • 当编写好自定义类加载器后,便可以在程序中调用loadClass方法实现类加载
说明
  • 其父类加载器是系统类加载器
  • JVM中所有类加载都会使用java.lang.ClassLoader.loadClass(String)接口(自定义类加载器并重写java.lang.ClassLoader.loadClass(String)接口除外),连JDK的核心类库也不能例外
//实现自定义类加载器
package com.chapter11;import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class MyClassLoader extends ClassLoader {private String byteCodePath;public MyClassLoader(String byteCodePath) {this.byteCodePath = byteCodePath;}public MyClassLoader(ClassLoader parent, String byteCodePath) {super(parent);this.byteCodePath = byteCodePath;}@Overrideprotected Class<?> findClass(String className) throws ClassNotFoundException {BufferedInputStream bis = null;ByteArrayOutputStream baos = null;try {//获取字节码文件完整路径String fileName = byteCodePath + className + ".class";//获取一个输入流bis = new BufferedInputStream(new FileInputStream(fileName));//获取输出流baos = new ByteArrayOutputStream();//具体读入数据并写出过程int len;byte[] data = new byte[1024];while ((len = bis.read(data)) != -1) {baos.write(data,0,len);}//获取内存中完整的字节数组的数据byte[] byteCodes  = baos.toByteArray();//调用defineClass,将字节数组的数据转换为Class实例Class<?> clazz = defineClass(null, byteCodes, 0, byteCodes.length);return clazz;} catch (IOException e) {e.printStackTrace();} finally {try {if (baos != null) {baos.close();}if (bis !=null) {bis.close();}} catch (IOException e) {e.printStackTrace();}}return null;}
}
//------
public class MyClassLoaderTest {public static void main(String[] args) {MyClassLoader loader = new MyClassLoader("d:/");try {Class<?> clazz = loader.loadClass("JavapTest");System.out.println("加载此类的加载器为:" + clazz.getClassLoader().getClass().getName());System.out.println("加载当前JavapTest类的加载器的父类加载器为:" +  clazz.getClassLoader().getParent().getClass().getName());} catch (ClassNotFoundException e) {e.printStackTrace();}}
}
//-----测试结果
加载此类的加载器为:com.chapter11.MyClassLoader
加载当前JavapTest类的加载器的父类加载器为:sun.misc.Launcher$AppClassLoader

相关文章:

JVM学习-自定义类加载器

为什么要自定义类加载器 隔离加载类 在某些框架内进行中间件与应用的模块隔离&#xff0c;把类加载到不同的环境&#xff0c;如Tomcat这类Web应用服务器&#xff0c;内部自定义了好几种类加载器&#xff0c;用于隔离同一个Web应用服务器上的不同应用程序 修改类加载的方式 …...

NDIS Filter开发-OID 请求

NDIS 定义对象标识符 (OID) 值来标识适配器参数&#xff0c;其中包括操作参数&#xff0c;例如设备特征、可配置的设置和统计信息。 Filter驱动程序可以查询或设置基础驱动程序的操作参数&#xff0c;或过滤/覆盖顶层驱动程序的 OID 请求。 NDIS 还为 NDIS 6.1 及更高版本的Fi…...

软考 系统架构设计师之考试感悟2

接前一篇文章&#xff1a;软考 系统架构设计师之考试感悟 今天是2024年5月25号&#xff0c;是个人第二次参加软考系统架构师考试的正日子。和上次一样&#xff0c;考了一天&#xff0c;身心俱疲。天是阴的&#xff0c;心是沉的&#xff0c;感觉比上一次更加沉重。仍然有诸多感悟…...

[学习笔记](b站视频)PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】(ing)

视频来源&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】 前面P1-P5属于环境安装&#xff0c;略过。 5-6.Pytorch加载数据初认识 数据文件: hymenoptera_data # read_data.py文件from torch.utils.data import Dataset …...

Flutter开发效率提升1000%,Flutter Quick教程之定义构造参数和State成员变量

一个Flutter页面&#xff0c;可以定义页面构造参数和State成员变量。所谓页面构造参数&#xff0c;就是当前页面构造函数里面的参数。 比如下面代码&#xff0c;a就是构造参数&#xff0c;a1就是State成员变量。 class Testpage extends StatefulWidget {String a;const Test…...

R语言数据分析-xgboost模型预测

XGBoost模型预测的主要大致思路&#xff1a; 1. 数据准备 首先&#xff0c;需要准备数据。这包括数据的读取、预处理和分割。数据应该包括特征和目标变量。 步骤&#xff1a; 读取数据&#xff1a;从CSV文件或其他数据源读取数据。数据清理&#xff1a;处理缺失值、异常值等…...

使用redis的setnx实现分布式锁

在Redis中&#xff0c;SETNX 是 “Set If Not Exists”&#xff08;如果不存在&#xff0c;则设置&#xff09;的缩写。这是一个原子操作&#xff0c;用于设置一个键的值&#xff0c;前提是这个键不存在。如果键已经存在,.则不会执行任何操作。 封装方法trylock&#xff0c;用…...

LangChain进行文本摘要 总结

利用LangChain进行文本摘要的详细总结 LangChain是一个强大的工具&#xff0c;可以帮助您使用大型语言模型&#xff08;LLM&#xff09;来总结多个文档的内容。以下是一个详细指南&#xff0c;介绍如何使用LangChain进行文本摘要&#xff0c;包括使用文档加载器、三种常见的摘…...

政安晨【零基础玩转各类开源AI项目】:解析开源项目的论文:Physical Non-inertial Poser (PNP)

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文解析的原始论文为&#xff1a;https://arxiv.org/…...

【机器学习】基于OpenCV和TensorFlow的MobileNetV2模型的物种识别与个体相似度分析

在计算机视觉领域&#xff0c;物种识别和图像相似度比较是两个重要的研究方向。本文通过结合深度学习和图像处理技术&#xff0c;基于OpenCV和TensorFlow的MobileNetV2的预训练模型模&#xff0c;实现物种识别和个体相似度分析。本文详细介绍该实验过程并提供相关代码。 一、名…...

建模杂谈系列244 TimeTraveller

说明 所有的基于时间处理和运行的程序将以同样的节奏同步和执行 TT(TimeTraveller)是一个新的设计&#xff0c;它最初会服务与量化过程的大量任务管理&#xff1a;分散开发、协同运行。但是很显然&#xff0c;TT的功能将远不止于此&#xff0c;它将服务大量的&#xff0c;基于时…...

基于MingGW64 GCC编译Windows平台上的 libuvc

安装cmake 打开cmake官网 https://cmake.org/download/&#xff0c;下载安装包&#xff1a; 安装时选择将cmake加到系统环境变量里。安装完成后在新的CMD命令窗口执行cmake --version可看到输出&#xff1a; D:\>cmake --version cmake version 3.29.3 CMake suite mainta…...

【Linux】网络高级IO

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Linux 目录 &#x1f449;&#x1f3fb;五种IO模型&#x1f449;&#x1f3fb;消息通信的同步异步与进程线程的同步异步有什么不同&#xff1f;&#x1f449…...

【C++ ——— 继承】

文章目录 继承的概念即定义继承概念继承定义定义格式继承关系和访问限定符继承基类成员访问方式的变化 基类对象和派生类对象的赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承与静态成员菱形继承虚继承解决数据冗余和二义性的原理继承的总结继承常见笔试面试题 继…...

kafka-守护启动

文章目录 1、kafka守护启动1.1、先启动zookeeper1.1.1、查看 zookeeper-server-start.sh 的地址1.1.2、查看 zookeeper.properties 的地址 1.2、查看 jps -l1.3、再启动kafka1.3.1、查看 kafka-server-start.sh 地址1.3.2、查看 server.properties 地址 1.4、再次查看 jps -l 1…...

TypeScript 中的命名空间和模块化

1. 命名空间&#xff08;Namespace&#xff09; 命名空间提供了一种逻辑上的代码分组机制&#xff0c;用于避免命名冲突和将相关代码组织在一起。它使用 namespace 关键字来定义命名空间&#xff0c;并通过点运算符来访问其中的成员。例如&#xff1a; // 定义命名空间 names…...

9 html综合案例-注册界面

9 综合案例-注册界面 一个只有html骨架的注册页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…...

Xilinx RFSOC 47DR 8收8发 信号处理板卡

系统资源如图所示&#xff1a;  FPGA采用XCZU47DR 1156芯片&#xff0c;PS端搭载一组64Bit DDR4,容量为4GB,最高支持速率&#xff1a;2400MT/s;  PS端挂载两片QSPI X4 FLASH&#xff1b;  PS支持一路NVME存储&#xff1b;  PS端挂载SD接口&#xff0c;用于存储程序&…...

ros2 launch 用法以及一些基础功能函数的示例

文章目录 launch启动一个节点的launch示例launch文件中添加节点的namespacelaunch文件中的话题名称映射launch文件中向节点内传入命令行参数launch文件中向节点内传入rosparam使用方法多节点启动命令行参数配置资源重映射ROS参数设置加载参数文件在launch文件中使用条件变量act…...

如何使用Python获取图片中的文字信息

如下有三中方法&#xff1a; 方法1. 使用Tesseract OCR&#xff08;pytesseract&#xff09; 安装依赖 首先&#xff0c;确保你已经安装了Tesseract OCR引擎&#xff08;例如&#xff0c;通过你的操作系统的包管理器&#xff09;。然后&#xff0c;你可以通过pip安装pytesse…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...