习惯了动态语言的代码热替换,一直想为java添加一个这样的特性,一直以为class的热替换是通过新建classloader完成的,所以一直在顺着这个思路在研究,我先研究了jetty的classloader机制,并没有发现什么特殊的地方,仅仅是对urlclassloader做了一个简单的拓展。 而且我创建了几个classloader均没有实现这个效果,我在无意中发现jetty在debug模式下会进行hotswap, 而run模式下则不会,我开始怀疑了,顺便实验了一下tomcat,发现tomcat也是在debug下可以进行hotswap, 因此我认为这可能是java自带的类重新加载。

通过jvisualvm观察java的运行参数,发现了agentlib参数

经过一番实验终于发现了java类hotswap的原理, 首先使用debug模式启动为jdwp服务器,然后使用jdb连接后,通过命令进行类redefine,才能实现hotswap.而eclipse实现方式是采用debug模式启动,然后由自己封装的debugger进行class热替换.  

总结一下要是自己想使用 hotswap,可以直接采用eclipse的debug模式,如果使用text,就自己封装一个jdb,去监听文件修改事件然后发送命令即可

还有一种设想,是采用自定义classloader, 1,重新define,2,重新new classloader