一个Java类文件到虚拟机里的对象,要经过如下过程:首先通过Java编译器,将Java文件编译成class
字节码,类加载器读取class
字节码,再将类转化为实例,对实例newInstance
就可以生成对象。
类加载器ClassLoader
功能,也就是将class
字节码转换到类的实例。在Java应用中,所有的实例都是由类加载器,加载而来。
一般在系统中,类的加载都是由系统自带的类加载器完成,而且对于同一个全限定名的java类(如com.csiar.soc.HelloWorld
),只能被加载一次,而且无法被卸载。
这个时候问题就来了,如果我们希望将java类卸载,并且替换更新版本的java类,该怎么做呢?
既然在类加载器中,Java类只能被加载一次,并且无法卸载。那么我们是不是可以直接把Java类加载器干掉呢?答案是可以的,我们可以自定义类加载器,并重写ClassLoader
的findClass
方法。
想要实现热部署可以分以下三个步骤:
销毁原来的自定义ClassLoader
更新class
类文件
创建新的ClassLoader
去加载更新后的class
类文件。
到此,一个热部署的功能就这样实现了。