要实现自己的class reload机制,首先需要明白我们面临什么样的问题,首先,虚拟机中使用到的Class都是由各种ClassLoader装载进来的,而绝大部分程序的开发者都不需要关心这个过程,我们面临的第一个问题就是需要将class装载这个过程拦截下来,让所有的需要reload 的class的装载都经过我们的机制,我们才有机会去执行我们的reload机制,因此我们需要拦截系统的ClassLoader,在class装载的时候实现自己的逻辑
jdk提供JVMTI(JVMDI,JVMPI),可以从底层的虚拟机里获取几乎所有虚拟机里发生的事件,我们可以通过捕获这些事件,加以处理,来实现我们的目的,但是操作jvm内部的事件必须非常小心,否则非常容易造成虚拟机工作不正常,甚至崩溃。同时,要使用JVMTI这些底层的api,我们需要使用c/c++来实现功能,对于我们要实现的目的来说,太复杂了点,而且,对于我来说,几乎没正经写过c/c++代码,因此这条路不予考虑。
从java5开始,jdk开始提供一种新的机制来帮助我们实现这种功能,java agent 可以方面的帮助我们实现这一功能,我们可以通过简单的实现一个包含premain方法的类就可以作为java agent在虚拟机里执行,具体可以参考文档
。因此,我们可以通过实现一个agent,在系统起来的时候通过instrmentation修改系统的ClassLoader,加入我们自己逻辑的代码来拦截class装载的过程。注意,这里只能修改已有方法的方法体,例如修改findClass方法,在这些方法体里可以加入调用我们真正逻辑的类的方法调用,来实现自己的class装载测律。
对于jdk 1.4及以前的版本呢?没有更好的办法,只能实现将系统的ClassLoader等相关类进行静态的enhance,然后通过 bootclasspath在rt.jar之前加载进来,用自己的类挡住系统自己的类,来实现我们的逻辑,除了这个拦截的方式不一样以外,其他的逻辑处理和jdk5没有区别,因此以后的讨论不需要区分jdk版本的区别。
class装载的过程由我们控制了,但是由于jvm自身的限制,对于已经装载进虚拟机的类(准确的说是装载进某一个ClassLoader的类),是无法做太大的修改的,只能修改方法的代码段,对于类结构是无法更改的,因此,我们面临的又一个问题就是如何巧妙的绕过这个限制。
其实想想也简单,既然已经装载进来的类无法做很大的修改,那我们就不让他装载进来!
嘿嘿,干活了,下次再说。邪恶吧?!
分享到:
相关推荐
该文介绍了如何利用Java HotSwap来提高开发效率,特别是在处理那些不易复现的问题时,它能让开发者更快地测试和验证修复方案。 在Java中,当你修改了某个类的非静态方法或者添加新的非final字段时,JVM支持热替换。...
Hotswap,全称为Dynamic Class File Manipulation (DCM),它扩展了Java虚拟机(JVM)的动态加载机制,不仅限于修改类的方法体,还能添加、删除类的属性和方法,甚至改变类的继承关系。这对于开发过程中频繁的代码...
热更的文件为java文件,大致是把java文件动态编译成class 然后用agentmain来进行热更 程序启动后,可以自己手动调用HotSwapManager.startTimerTask()方法来启动自动热更的schedule 也可以自己弄个定时器,调用...
hotswap-agent-1.3.1-SNAPSHOT.jar+DCEVM-full-7u79-installer.jar 适用jdk版本1.7.0_79 DCEVM-full-7u79...-XXaltjvm=dcevm -javaagent:E:\develope\hotswap-agent\hotswap-agent-1.3.1-SNAPSHOT.jar 然后享受热加载吧
# 基于Java的Hotswap插件 [![Version](https://img.shields.io/jetbrains/plugin/v/PLUGIN_ID.svg)](https://plugins.jetbrains.com/plugin/PLUGIN_ID) [![Downloads]...
HotSwap正式版是占用内存很小且使用范围很广泛的硬盘热插拔软件,HotSwap最新版可智能识别系统的热插拔设备,在系统中增加一个图标,方便关闭SATA硬盘,这样你的热插拔设备就会比较安全了
"前端开源库-hotswap"是针对Node.js环境设计的一个开源库,它的主要功能是实现模块的代码热交换。Node.js作为服务器端JavaScript运行环境,广泛应用于后端开发,而hotswap技术则为Node.js应用提供了实时更新代码的...
标题 "4.hotswap.7z" 提到的关键词是 "hotswap",这通常与Java开发中的热替换(HotSwap)技术有关。热替换是指在应用程序运行时,能够替换或更新类的定义,而无需重启应用。这对于开发环境非常有用,因为它提高了...
Java 类的热重载(Hot Deployment)或热替换(Hot Swap)是开发过程中非常实用的功能,它允许开发者在不重启应用程序服务器(如Tomcat)的情况下更新已部署的类,从而提高开发效率。在这个例子中,我们将探讨如何在...
**PMBus™ 应用配置文件对于热插拔控制器** (Hot Swap Controller, HSC) 的V1.0版本文档详细规定了热插拔控制器在服务器节点中的应用规范,这些节点接受直流输入电源。该标准旨在通过现有的PMBus命令来支持对节点内...
开发者可以通过继承`java.lang.ClassLoader`创建自己的类加载器,实现特定的类加载逻辑,如动态加载、代码热替换(HotSwap)等功能。HotSwap允许在JVM运行时替换已加载的类,从而无需重启应用就能更新代码,提高了...
think-hotswap一个简单的Java类替换工具简介本工具采用Java内部提供的Instrumentation来实现类的热替换操作,故不支持修改类结构与类方法的操作,但是能在不修改类结构和方法的情况下,简单的修改其方法内部的一些...
R2.0代表这一规范的第二个修订版本,通常包含对前一版本的改进和增强。 在CPCI Hotswap系统中,关键组件包括热插拔控制器(Hot Swap Controller,HSC)和热插拔电源管理器(Hot Swap Power Manager,HSPM)。HSC...
HotSwap,是一款专业的sata硬盘热插拔工具。 大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏...
jdk-8u181-macosx-x64.dmg DCEVM-8u181 hotswap1.4.2
1、需要用到的agent/commons-agent.jar为hotswap打出来的包(HotSwapManager中定义) 2、需要用到lombok插件 3、测试的class为 DemoTestClazz 4、定时检测热更的class为CheckHotwapSchedule 5、热更后...
npm install hotswap-module --global CLI用法 以下三个命令均运行script.js文件,并将对require('stream')任何调用替换为require('readable-stream') 。 如果未安装hotswap-module ,只需使用npx运行它: npx hot...
添加hotswap和hotswap-runtime依赖于你的Cargo.toml 。 将具有相同项目名称和路径的dylib构建添加到Cargo.toml 。 添加#![feature(plugin, const_fn)]功能门。 导入插件#![plugin(hotswap)] 。 使用#[hotswap]...
热插拔(Hot Swap)是CPCI系统中的一个重要特性,允许在系统运行时插入或移除模块,无需中断电源或操作系统,极大地提高了系统的可用性和维护性。 **一、PICMG 2.1 R2.0规范** PICMG(Peripheral Component ...
HotSwap,是一款专业的sata硬盘热插拔工具。大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏...