【深入理解Java虚拟机】笔记6:自定义ClassLoader两种方式例子

自定义druid连接池的工具类 1、druid连接池所需要的jar包和配置文件druid.properties,先配置好 2、自定义的druid的工具类 package cn.itcast.dataSource.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOE... 阅读详情
一、重写findClass实现:
package com.example.jvm;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;

public class NClassLoader extends ClassLoader {
	@Override
	public Class<?> findClass(String name) throws ClassNotFoundException {
		Class<?> clazz = findLoadedClass(name);
		if (clazz == null) {
			String filename = "D:\\workplaces\\demo\\target\\classes\\" + name.replace('.', File.separatorChar) + ".class";
			System.out.println(filename);
			try {
				FileInputStream fis = new FileInputStream(filename);
				FileChannel channel = fis.getChannel();
				ByteArrayOutputStream bos = new ByteArrayOutputStream();
				WritableByteChannel wChannel = Channels.newChannel(bos);
				ByteBuffer buffer = ByteBuffer.allocate(1024);
				while(true) {
					int i = channel.read(buffer);
					if (i == 0 || i == -1) {
						break;
					}
					buffer.flip();
					wChannel.write(buffer);
					buffer.clear();
				}
				fis.close();
				byte[] arr = bos.toByteArray();
				clazz = defineClass(name, arr, 0, arr.length);
			} catch (Exception e) {
				throw new ClassNotFoundException();
			}
		}
		return clazz;
	}
}
package com.example.jvm;

import java.util.ArrayList;
import java.util.List;

public class ClassLoaderTest {
	public static List<String> instance = new ArrayList<>();

	public static void main(String[] args) throws Exception {
		NClassLoader loader = new NClassLoader();
		Class<?> clazz = loader.findClass(ConstantClass.class.getCanonicalName());
		Object object = clazz.newInstance();
		System.out.println(object);
		System.out.println(object instanceof ConstantClass);
		System.out.println(instance instanceof List);
	}

}

二、重写loadClass实现
package com.example.jvm;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;

public class NClassLoader2 extends ClassLoader {
	@Override
	public Class<?> loadClass(String name) throws ClassNotFoundException {
		Class<?> clazz = findLoadedClass(name);
		if (clazz != null) {
			return clazz;
		}
		if (!name.startsWith("com.example.jvm")) {
			return super.loadClass(name);
		}
		String filename = "D:\\workplaces\\demo\\target\\classes\\" + name.replace('.', File.separatorChar) + ".class";
		System.out.println(filename);
		try {
			FileInputStream fis = new FileInputStream(filename);
			FileChannel channel = fis.getChannel();
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			WritableByteChannel wChannel = Channels.newChannel(bos);
			ByteBuffer buffer = ByteBuffer.allocate(1024);
			while(true) {
				int i = channel.read(buffer);
				if (i == 0 || i == -1) {
					break;
				}
				buffer.flip();
				wChannel.write(buffer);
				buffer.clear();
			}
			fis.close();
			byte[] arr = bos.toByteArray();
			return defineClass(name, arr, 0, arr.length);
		} catch (Exception e) {
			e.printStackTrace();
		}
		throw new ClassNotFoundException();
	}
}
package com.example.jvm;

import java.util.ArrayList;
import java.util.List;

public class ClassLoaderTest {
	public static List<String> instance = new ArrayList<>();

	public static void main(String[] args) throws Exception {
		NClassLoader2 loader = new NClassLoader2();
		Class<?> clazz = loader.loadClass(ConstantClass.class.getCanonicalName());
		Object object = clazz.newInstance();
		System.out.println(object);
		System.out.println(object instanceof ConstantClass);
		System.out.println(instance instanceof List);
	}
}

三、总结

推荐使用方式一

深入理解Java ClassLoader的机制与自定义实践 ClassLoader是Java中的一个核心概念,它负责加载Java类到JVM(Java虚拟机)中。Java语言的"一次编译,到处运行"的特性依赖于ClassLoader实现。每个被加载的类都由一个ClassLoader实例所负责,从而保证了Java类的动态加载和运行时的灵活性。在自定义时,我们通常会覆盖findClass方法来实现类的查找逻辑。例如,我们可以从网络、数据库或者其他非标准的源中读取类字节码,并使用将其转换为Class对象。 阅读详情

相关推荐

深入理解Java类加载机制:ClassLoader实战指南

Java ClassLoader是Java平台的核心组件,负责将类的.class文件加载到JVM(Java虚拟机)中,以供运行时使用。ClassLoader的工作涉及将字节码文件从不同来源(如文件系统、网络或内存等)加载到内存中,并将这些字节码转换成JVM能够理解和执行的内部数据结构。ClassLoader不仅保证了Java应用的安全性和隔离性,还支持了Java特有的动态性和模块化部署。

weixin_35920379的博客 1105

深入理解java虚拟机jvm之类加载机制和类加载器(ClassLoader)(5)

深入理解java虚拟机jvm之类加载机制和类加载器(ClassLoader)

cputao的博客 218

深入理解Java ClassLoader的工作机制

本文还有配套的精品资源,点击获取 简介:ClassLoader是Java的核心组件,负责将类加载到JVM中执行。本文深入探讨了ClassLoader的工作原理和流程,包括其遵循的双亲委托模型、加载类的三个步骤(查找、加载、验证与初始化),以及如何通过源码分析和自定义实现来深入理解其机制。同时,讨论了ClassLoader在动态加载类、热部署和插件系统开发中的应用。掌握Cla...

weixin_42599558的博客 998

Java类加载机制(ClassLoader)详解

类加载机制总结 1.类加载器基本概念 类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。...

huzecom的博客 4941

抖音短视频数据抓取实战系列(一)——模拟器性能对比与优化配置

本文是抖音短视频数据抓取实战系列的开篇,重点探讨了模拟器选型与优化配置。通过对比雷电、夜神、逍遥三大主流模拟器在性能、抖音兼容性及抓包友好度上的表现,文章指出雷电模拟器因其稳定的桥接网络模式和良好的兼容性,是数据抓取的优选。并提供了雷电模拟器从安装、网络桥接到系统优化的详细配置指南,旨在帮助读者构建稳定高效的抓取环境。

weixin_29230901的博客 247

网马解密大讲堂——网马解密中级篇001(Freshow工具使用方法)

今天主要讲解的内容是Freshow工具的使用方法,工欲善其事,必先利其器,首先要学会如何使用解密工具,才能一步一步进入解密的殿堂,揭开网马解密的神秘面纱。好了,我们先来认识认识我们用到工具(Freshow),截图如下 2009-8-20 10:15 上传 下载附件 (67.18 KB) 1.URL:要解密的网址地址 2.Check:用来...

weixin_33858249的博客 296

大语言模型在构建UNSPSC 分类数据中的应用

UNSPSC 是联合国标准产品和服务代码。本文研究如何利用大语言模型生成分类系统的分析

姚家湾博客 1871

《深入理解java虚拟机》读书笔记之类加载案例实战

##前言最近在读《深入理解java虚拟机》,第三部分-虚拟及执行子系统。作者从类文件结构讲到虚拟机类加载机制、虚拟机字节码执行引擎,最后还分析了几种常见的类加载器架构,其中我们就看到了熟悉的动态代理了,最后最后作者提供了一个实战例子:自己动手实现远程执行功能。  在网络上搜索了一下,大部分笔记文章都是在总结理论知识点,本人觉得从实例中验证理论会更有体感,就尝试跟着作者的思路,实现一下这个例子,所谓...

happy524648459的专栏 412

三菱FX5U-PLC建立CClink的IO通讯

最新需要用三菱的FX5U的PLC搭建一个CClink通讯,PLC做主站,控制CClink从站的IO,下面2个输入模块AJ65SBTB1-32D,两个输出模块AJ65SBTB1-32T。3、在右侧的部件,选择网络模块:FX5-CCL-MS,CC-link主站模块。依次把加入两个AJ65SBTB1-32D,两个AJ65SBTB1-32T。7、基本设置,网络配置设置,链路刷新设置,设置好下面参数,应用。6、基本设置,网络配置设置,CC-Link配置设置。8、部件选择,模块,右键,添加模块标签。

wzz418550729的博客 1002

Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿。本篇博客汇总了我对工厂模式和策略模式的理解,以及我是如何把它们巧妙运用在实际项目当中的一些技巧进行了分享,如有问题,欢迎评论区讨论!

黄团团的个人博客 2613

深入理解ClassLoader工作机制

前言 ClassLoader类加载器可以说是Java中必学内容之一,无论是想要去研究Concurrent包、Unsafe,还是深入学习Spark等分布式计算框架,都必须对此有一定的理解。笔者在写之前也只了解了皮毛,想通过这篇文章,结合一些书籍和博客,加深对ClassLoader的理解,并分享一下。 什么是class文件? xxx.class想必不陌生,JVM不会理解我们写的Java源文件, 我们必...

Deegue 8643

车规SoC深度对比:高通8397 vs 比亚迪D9000 vs 联发科CT-X1/MT8676/MT2715

芯片优势弱势最适合场景高通 8397低功耗、低延迟AI和音频处理单屏算力略低HUD + 音响座舱 + 低延迟交互D9000多屏渲染、Wi-Fi7高速通信AI算力中等高端多屏座舱 + 流媒体娱乐CT-X1极高AI算力、多模态渲染功耗较高高端沉浸式智能座舱 + 多摄像头感知MT8676算力均衡、座舱应用全面GPU稍弱全栈智能座舱、音视频多任务MT2715成本低、入门座舱可用算力低,低端显示入门智能座舱、基础信息娱乐。

weixin_43199439的博客 1771

深入理解Java和Android中的ClassLoader

解析ClassLoader 我们知道Dalvik(DVM)和ART加载的是dex文件,而JVM加载的是Class文件,因此Android和Java的类加载器ClassLoader是有去别的,因此本文分别介绍Java中的ClassLoader和Android中的ClassLoader。 1. Java中的ClassLoader 1.1 ClassLoader的类型 Java中的类加载器主要有两种类型,分别是系统类加载器和自定义类加载器。其中系统类加载器包括...

lixiong0713的博客 2万+

Android功耗系列专题理论之一:功耗优化分析思路简介

本文系统介绍了电子系统功耗分析方法,涵盖静态与动态功耗原理、电流波形分析技术和模块化拆解策略。重点阐述了PMIC与CPU协同管理机制、DVFS动态调节技术,以及通过示波器捕获波形特征定位异常的方法。针对亮屏等典型场景,提出三阶段对比分析法,并详细说明硬件/软件拆解方案及混合验证策略。文章还总结了常见问题模块(CPU、多媒体、外设)的排查流程,强调需结合日志分析、温度控制及重复测试确保数据可靠性,为功耗优化提供系统化解决方案。

1459

[Python] 为什么你的脚本明明没报错,却什么也没发生?

Python脚本运行后没报错却没结果?这是许多开发者遇到的棘手问题。文章分析了六种常见原因:代码未进入目标逻辑分支、输出路径错误、中间数据为空、异常被吞掉、异步操作未完成、运行了错误脚本版本。建议通过"过程可视化"排查,如打印关键变量、检查工作目录、验证数据状态等。职场中更应关注结果验证而非单纯代码执行,确保脚本真正解决问题。建立结果验证意识是从"会写代码"到"稳定交付"的关键转变。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 303

深入理解 Java ClassLoader:从原理到实战

Overridetry {✅最佳实践:始终调用指定父加载器,保持委派链完整。遵循双亲委派:除非有充分理由,否则不要重写loadClass;重写findClass:实现自定义加载逻辑的标准方式;显式指定父加载器:避免意外使用错误的委派链;管理资源生命周期:及时释放 ClassLoader 及其加载的类;慎用静态缓存:避免内存泄漏;善用上下文类加载器:在 SPI 或框架中加载应用资源。是 Java 动态能力的灵魂。理解它,不仅能帮你解决等疑难杂症,更能让你在设计。

m0_37607945的博客 783

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java ClassLoader机制深度解析:从原理到实战应用

本文详细介绍Java ClassLoader,并结合图表进行详细说明。

一起探索IT的世界 1156

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java ClassLoader总结

ClassLoader的终极目标是干啥? 将一串二进制数据传递给虚拟机,虚拟机据此构建一个Class对象 为啥要有ClassLoader这个东西? 可以更加灵活地控制类加载的过程(比如可以在运行时加载类从而实现程序的热更新) 可以对class文件进行加密 ClassLoader的特点 全盘负责机制和双亲委托模型

wyzzgo的技术博客 909

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深入理解Java ClassLoader

ClassLoader 做什么的? 延迟加载 各司其职 ClassLoader 传递性 双亲委派 Class.forName 自定义加载器 Class.forName vs ClassLoader.loadClass 钻石依赖 分工与合作 Thread.contextClassLoader ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清...

HelloWorld搬运工 877

Java自定义ClassLoader加载外部类

前几天在GitHub上下载了一个开源项目想要运行起来,启动这个项目会关联到数据库的一些表。因此想要运行起来还需要把数据库表建好。但是这个项目涉及到几十张表,并且作者没有给建表的SQL语句。(后续:吐血中,作者在项目给了sql语句。。。。。)想用这个项目那就只好自己建表了,但是几十张表自己建一时半会儿也弄不好。有这时间还不如重新找一个新项目于是果断放弃了这个项目,结果找了一圈发现这种类型的开源Java项目还真是少。于是,没办法还是回到这个项目。

Myd 1988

Java面试-类加载器:Bootstrap、Extension、Application ClassLoader

《Java面试200问》系列文章《类加载器:Bootstrap、Extension、Application ClassLoader》深入解析了JVM类加载机制。文章将JVM类加载器比喻为HR部门,详细介绍了三大核心类加载器: Bootstrap ClassLoader:C++实现的顶层加载器,负责加载Java核心类库(如rt.jar),在Java代码中表现为null。 Extension ClassLoader:管理JRE扩展目录(lib/ext)中的类,是Application的父加载器。 Applica

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

深入理解ClassLoader

JVM 中预置的 3 种 ClassLoader 只能加载特定目录下的 .class 文件,如果我们想加载其他特殊位置下的 jar 包或类时(比如,我要加载网络或者磁盘上的一个 .class 文件),默认的 ClassLoader 就不能满足我们的需求了,所以需要定义自己的 Classloader 来加载特定目录下的 .class 文件。自定义一个类继承ClassLoader重写findClass方法在findClass中,调用defineClass方法将字节码转换成Class对象,并且返回。

q374121871的博客 780

深入理解ClassLoader工作机制(jdk1.8)

ClassLoader 顾名思义就是类加载器,ClassLoader 作用: 负责将 Class 加载到 JVM 中 审查每个类由谁加载(父优先的等级加载机制) 将 Class 字节码重新解析成 JVM 统一要求的对象格式 类加载时机与过程 类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解...

小张的专栏 4万+

深入理解Java虚拟机:(一)Java代码是如何运行的?

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。再分享一波我的Java面试真题+视频学习详解+技能进阶书籍《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!” />对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

A1867350的博客 960

深入理解JVM类加载器ClassLoader

深入理解JVM类加载器ClassLoader classLoader类,它是一个抽象类,其后所有的类加载器都继承自classLoader(不包括启动类加载器) 方法 说明 getParent() 返回该类加载器的父类加载器。 loadClass(String name) 加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。 findClass(String name) 查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。

水巷石子的博客 2686
上一篇: 【深入理解Java虚拟机】笔记5:Java类加载中被动引用例子
下一篇: springboot——集成selenium模拟登陆
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值