通过装载类时修改类名加上版本号来实现类重新装载,这时最核心的问题实际上已经解决了,至少类变化时可以马上装载进来使用了,但是同时带来一些问题:
* 类名被修改了,反射怎么办?
比如,我的类Test里面,有 worker = new Worker(),这时候返回的实际上是一个Worker_V_1的实例,正常的方法调用是没问题了,不过如果worker.getClass().getName()咋整?很简单,我们照样,在jvm boot的时候,enhance一下java.lang.Class,拦截住getName,发现如果当前这个Class的实例(Worker_V_1.class)是被enhance过的(通过类名特征来识别),那么就返回enhance前的类名Worker而不是Worker_V_1。
到此为止,似乎问题解决了。
---------------
其实,这只是一个简化过的思路而已,真正去实现的时候,问题还是很多的,比如说:
* 要把发现的classloader都管理起来,会添加对这些classloader的额外的引用,这个是一个很严重的问题
* 要把除了class以外的一些资源也要管理起来,例如一些xml啥的,还得通知相应的回调去处理这个更新,毕竟我们不可能把什么事情都做了,要留下扩展点
* 这个扩展点怎么设计,让扩展的人如何介入到类重新装载的过程中来,也是要小心的事情
* 在对类enhance的过程中,难免会添加一些方法进去,因此,前面对Class的enhance还需要拦截getMethods,getFields等一系列的方法来滤掉添加的方法,同样,反射要用到的Field,Method,Constructor等类也需要处理
* 还有,接口怎么处理?代理(Proxy)怎么处理?
* 其他的bytecode enhance的类库怎么处理,例如装载的类是cglib生成/enhance过的,怎么整?
问题还很多,就不一一描述了,其实沿着这个思路是完全可行的,因为这个思路就是javarebel的思路,只是一些细节就不好说的太白了,否则又要被告状了。
这篇文章就到此为止吧,不要说太监了,呵呵。相关的问题看以后想不想找几个说明一下,it depends.
分享到:
相关推荐
该文介绍了如何利用Java HotSwap来提高开发效率,特别是在处理那些不易复现的问题时,它能让开发者更快地测试和验证修复方案。 在Java中,当你修改了某个类的非静态方法或者添加新的非final字段时,JVM支持热替换。...
Hotswap,全称为Dynamic Class File Manipulation (DCM),它扩展了Java虚拟机(JVM)的动态加载机制,不仅限于修改类的方法体,还能添加、删除类的属性和方法,甚至改变类的继承关系。这对于开发过程中频繁的代码...
hotswap文件夹中有三个文件 1、classes文件夹,就是把java文件编译出来的class文件存放位置 2、java文件夹,就是你要热更的java文件存放路径(热更的时候把你要热更的java文件放到里面就好) 3、history文件夹,...
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来实现类的热替换操作,故不支持修改类结构与类方法的操作,但是能在不修改类结构和方法的情况下,简单的修改其方法内部的一些...
Failed to start swap(解决方案).md
**CPCI Hotswap 技术详解** CPCI(CompactPCI,紧凑型PCI)是一种基于PCI总线技术的工业级标准,旨在提供更坚固、可靠的计算平台,尤其适用于电信、军事和航空航天等领域。CPCI规范继承了PCI接口的高速数据传输能力...
HotSwap,是一款专业的sata硬盘热插拔工具。 大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏...
在探讨Java并发编程与高并发解决方案之前,我们首先需要理解几个关键概念:并发(Concurrency)、高并发(High Concurrency)以及多线程(Multithreading)。这些概念是现代软件开发中不可或缺的一部分,尤其是在...
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...