要实现自己的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示例。参考http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/
热更的文件为java文件,大致是把java文件动态编译成class 然后用agentmain来进行热更 程序启动后,可以自己手动调用HotSwapManager.startTimerTask()方法来启动自动热更的schedule 也可以自己弄个定时器,调用...
修改java类不需要重启jboss的利器--hotswap安装手册
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 然后享受热加载吧
HotSwap正式版是占用内存很小且使用范围很广泛的硬盘热插拔软件,HotSwap最新版可智能识别系统的热插拔设备,在系统中增加一个图标,方便关闭SATA硬盘,这样你的热插拔设备就会比较安全了
think-hotswap一个简单的Java类替换工具简介本工具采用Java内部提供的Instrumentation来实现类的热替换操作,故不支持修改类结构与类方法的操作,但是能在不修改类结构和方法的情况下,简单的修改其方法内部的一些...
接CPCI Hotswap ----- PICMG 2.1 R2.0(Hot Swap)-1
HotSwap,是一款专业的sata硬盘热插拔工具。 大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏...
1、需要用到的agent/commons-agent.jar为hotswap打出来的包(HotSwapManager中定义) 2、需要用到lombok插件 3、测试的class为 DemoTestClazz 4、定时检测热更的class为CheckHotwapSchedule 5、热更后...
CPCI 热插拔设计规范,希望对大家有用! 由于容量大小限制,这是前部分,后部分在另一主题: CPCI Hotswap ----- PICMG 2.1 R2.0(Hot Swap)-2
重温java之classloader体系结构(含hotswap) 启动类加载器 扩展类加载器 系统类加载器
npm install hotswap-module --global CLI用法 以下三个命令均运行script.js文件,并将对require('stream')任何调用替换为require('readable-stream') 。 如果未安装hotswap-module ,只需使用npx运行它: npx hot...
PMBus™ Application Profile for Hot Swap Controllers V1.0.pdf
添加hotswap和hotswap-runtime依赖于你的Cargo.toml 。 将具有相同项目名称和路径的dylib构建添加到Cargo.toml 。 添加#![feature(plugin, const_fn)]功能门。 导入插件#![plugin(hotswap)] 。 使用#[hotswap]...
HotSwap,是一款专业的sata硬盘热插拔工具。大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏...
jdk-8u181-macosx-x64.dmg DCEVM-8u181 hotswap1.4.2
HotSwap交换了有关2016年大选的所有帖子(从过道的每一侧)与相关的,可操作的政治参与信息,并抛出了GIF幼犬,以作为一种很好的措施。 帖子不会以任何方式删除或删除。 您仍然可以选择查看它们,但是默认情况下它们...
前端开源库-hotswaphotswap,用于node.js模块的代码热交换
Mojito-rs-Hotswap 是 Mojito 资源存储的热插拔(Hotswap)插件。 标签:Mojito 分享 window._bd_share_config = { "common": { "bdSnsKey": {}...
凌力尔特公司(Linear)推出2.9V至15V热插拔(Hot Swap)控制器LTC 4280,该器件具内置8位ADC和I2C兼容接口。集成的数字电源监视可在高可用性系统中实现复杂的平台管理,测量板卡电压和电流以及记录过去和现在的故障情况...