`
argan
  • 浏览: 129583 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实现增强的java class hotswap (三) 解决方案

阅读更多

这段时间瞎忙,这篇文章没有写下去,被人鄙视是太监文,郁闷,只好抽时间继续。

----------------------------

上回说道我们要实现类字节码的动态装载,一个思路就是不让这个类真正的被装载进虚拟机,因为一旦真正的装载进来了,就无法对其进行结构上的修改,这些在前文中已经提到过了。那怎么才能不让类装载进来但是又能使用它呢?

 

这看起来像一个悖论,我们要在应用是使用一个类,初始化它,构造它的实例,调用方法,等等,但是又不能装载这个类,这不忽悠人么?

 

暂时不管如何做到,先看看问题本身。我们要解决的问题就是当一个类(例如Worker)已经在虚拟机里面使用了,比如有程序Test引用到了Worker,这时候,Worker修改过了(Work'),字节码更新过了,我们需要在不重新启动jvm的情况下,让Test新发起的调用都使用到Work'的代码。我们怎么处理呢?

 

我们的方案:虚拟机起来的时候,在Test里,发现(TODO1)要使用Worker类,我们装载一个WorkerVersion1给Test使用,当发现(TODO2)Worker类的字节码变化了,我们需要默默的装载(TODO3)一个WorkerVersion2进来,给Test使用,同时需要不让Test知道有这个变化。

 

这几个TODO解决掉了,我们的问题也差不多了。

 

* TODO1,监控虚拟机装载类

这个不难,我们用agent去enhance一下java.lang.ClassLoader,修改findClass/findResource等方法,加入我们自己的检查和装载逻辑,然后redefine这个类即可,没有问题

 

* TODO2,监控类字节码变化

在装载这个类的时候,记录下这个类的来源,例如来自某个目录,来自某个jar,然后在需要的时候检查这个资源是否改变,如果改变了就发起重新装载的消息即可,也没啥问题

 

* TODO3,重新装载一个变化了的类

这里才是技巧的核心,我们在装载类的时候,使用字节码解析工具(例如asm),直接找到字节码,修改它,生成一个带版本号的类名,例如将Worker修改成Worker_V_1,返回给上面使用,当发现类有修改的时候,我们就装载一个Worker_V_2出来,给上面使用。

 

在我们修改字节码的时候,需要处理很多东西,例如,处理Test类的时候,发现他要调用Worker类的一个go方法,我们需要先检查Worker类的当前版本,然后再去调用找到的当前版本类的相应方法,这个必须是动态的,否则Worker变成V2了,Test还在调用V1上的方法。同样的,出了拦截方法调用(INVOKE_INTERFACE,INVOKE_STATIC,INVOKE_VIRTUAL,INVOKE_SPECIAL,INVOKE_DYNAMIC)以外还要处理field的读写(PUTFEILD,PUTSTATIC,GETFIELD,GETSTATIC),和方法调用的处理类似,需要动态的检查操作的类。

 

但是这样,问题又出来了,如果我使用反射呢?岂不是会得到Worker_V_1这样的类了?显然不行。

 

 

 

2
1
分享到:
评论
2 楼 argan 2009-08-10  
to be continued....hehe
1 楼 axman 2009-08-10  
argan,这个还是太监帖啊

相关推荐

    Java hotswap demo

    该文介绍了如何利用Java HotSwap来提高开发效率,特别是在处理那些不易复现的问题时,它能让开发者更快地测试和验证修复方案。 在Java中,当你修改了某个类的非静态方法或者添加新的非final字段时,JVM支持热替换。...

    修改java类不需要重启jboss的利器--hotswap安装手册

    Hotswap,全称为Dynamic Class File Manipulation (DCM),它扩展了Java虚拟机(JVM)的动态加载机制,不仅限于修改类的方法体,还能添加、删除类的属性和方法,甚至改变类的继承关系。这对于开发过程中频繁的代码...

    hotswap-for-java-file.zip

    hotswap文件夹中有三个文件 1、classes文件夹,就是把java文件编译出来的class文件存放位置 2、java文件夹,就是你要热更的java文件存放路径(热更的时候把你要热更的java文件放到里面就好) 3、history文件夹,...

    hotswap-agent+DCEVM-full

    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插件.zip

    # 基于Java的Hotswap插件 [![Version](https://img.shields.io/jetbrains/plugin/v/PLUGIN_ID.svg)](https://plugins.jetbrains.com/plugin/PLUGIN_ID) [![Downloads]...

    HotSwap!.EXE

    HotSwap正式版是占用内存很小且使用范围很广泛的硬盘热插拔软件,HotSwap最新版可智能识别系统的热插拔设备,在系统中增加一个图标,方便关闭SATA硬盘,这样你的热插拔设备就会比较安全了

    前端开源库-hotswap

    "前端开源库-hotswap"是针对Node.js环境设计的一个开源库,它的主要功能是实现模块的代码热交换。Node.js作为服务器端JavaScript运行环境,广泛应用于后端开发,而hotswap技术则为Node.js应用提供了实时更新代码的...

    4.hotswap.7z

    标题 "4.hotswap.7z" 提到的关键词是 "hotswap",这通常与Java开发中的热替换(HotSwap)技术有关。热替换是指在应用程序运行时,能够替换或更新类的定义,而无需重启应用。这对于开发环境非常有用,因为它提高了...

    java class reload

    Java 类的热重载(Hot Deployment)或热替换(Hot Swap)是开发过程中非常实用的功能,它允许开发者在不重启应用程序服务器(如Tomcat)的情况下更新已部署的类,从而提高开发效率。在这个例子中,我们将探讨如何在...

    PMBus™ Application Profile for Hot Swap Controllers V1.0.pdf

    **PMBus™ 应用配置文件对于热插拔控制器** (Hot Swap Controller, HSC) 的V1.0版本文档详细规定了热插拔控制器在服务器节点中的应用规范,这些节点接受直流输入电源。该标准旨在通过现有的PMBus命令来支持对节点内...

    classloader体系结构(含hotswap)

    开发者可以通过继承`java.lang.ClassLoader`创建自己的类加载器,实现特定的类加载逻辑,如动态加载、代码热替换(HotSwap)等功能。HotSwap允许在JVM运行时替换已加载的类,从而无需重启应用就能更新代码,提高了...

    think-hotswap:一个简单的Java类替换工具

    think-hotswap一个简单的Java类替换工具简介本工具采用Java内部提供的Instrumentation来实现类的热替换操作,故不支持修改类结构与类方法的操作,但是能在不修改类结构和方法的情况下,简单的修改其方法内部的一些...

    Failed to start swap(解决方案).md

    Failed to start swap(解决方案).md

    CPCI Hotswap ----- PICMG 2.1 R2.0(Hot Swap)-2

    **CPCI Hotswap 技术详解** CPCI(CompactPCI,紧凑型PCI)是一种基于PCI总线技术的工业级标准,旨在提供更坚固、可靠的计算平台,尤其适用于电信、军事和航空航天等领域。CPCI规范继承了PCI接口的高速数据传输能力...

    HotSwap-sata硬盘热插拔工具

    HotSwap,是一款专业的sata硬盘热插拔工具。 大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏...

    java并发编程与高并发解决方案

    在探讨Java并发编程与高并发解决方案之前,我们首先需要理解几个关键概念:并发(Concurrency)、高并发(High Concurrency)以及多线程(Multithreading)。这些概念是现代软件开发中不可或缺的一部分,尤其是在...

    DCEVM+HotSwapAgent实现java类热加载工具

    jdk-8u181-macosx-x64.dmg DCEVM-8u181 hotswap1.4.2

    common-tools-hotswap.zip

    1、需要用到的agent/commons-agent.jar为hotswap打出来的包(HotSwapManager中定义) 2、需要用到lombok插件 3、测试的class为 DemoTestClazz 4、定时检测热更的class为CheckHotwapSchedule 5、热更后...

    hotswap-module:无需任何代码更改即可将Node.js模块替换为另一个模块

    npm install hotswap-module --global CLI用法 以下三个命令均运行script.js文件,并将对require('stream')任何调用替换为require('readable-stream') 。 如果未安装hotswap-module ,只需使用npx运行它: npx hot...

Global site tag (gtag.js) - Google Analytics