在Java 应用开发中,经常会有的一个问题,需要在应用正在运行的过程中,把一个新实现的功能加到class中,并且不能停止当前的应用运行。也就是说,要实现类的热替换(Hotswap)。这一点,在Java Web应用中体现的更为明显,每次更新配置,更新class,都需要重新启动服务器,重新加载这些改动,这一过程相当耗时。
那为什么不在应用服务器运行时,或者说Java的应用运行过程中,把class替换后实时生效呢?
这一点,是和Class的生命周期密切相关的。
任何一个使用到的Class,都需要被classLoader加载到JVM中,这个加载的过程,又分为
defineClass
loadClass
resolveClass
即根据提供的不同形式的class文件的内容,转化成一个Class,对其进行加载,链接。
而所谓的hotswap,就是使用新的代码替换掉已经加载的这个Class中的内容。
我们这里使用Javassist来模拟类似的效果,通过动态的修改class内某个方法的内容,来实现热替换的效果。
基本步骤:
先定义一个接口,包含一个方法,该方法内的内容在后面用于热替换
定义一个接口的实现
在Servlet内接收页面上传入的参数