读书人

经过ClassLoader实现容器热部署实例

发布时间: 2012-10-28 09:54:44 作者: rapoo

通过ClassLoader实现容器热部署实例

在J2EE的项目中,容器给我们提供的热部署功能使得我们不用重启动容器而修改我们的代码。比如使用Weblogic,我们可以在Weblogic-application.xml中配置是否支持热部署Servlet。查阅Weblogc 文档,其实在Weblogic中,EJB组件也是可以热部署的,但如果要热部署EJB组件,Weblogc要求必须自定义ClassLoder。

??? JVM规范中没有指定JVM支持动态加载修改过的类。类的加载,卸载对于程序员是透明的。如果我们要实现类的动态加载,我们就要理解JVM本身类的加载与卸载的原理,实现热部署。对于JVM加载类方面的资料在网上很多的,在这里我做简单概述:
??? (1)JVM加载时通过ClassLoader加载的。
??? (2)JVM有3层继承关系的ClassLoder 分别是:
????????????

测试类;Main 每隔 5s 加载一次

运行时,每隔5s 输出:
hahaha
classloader.DynamicClassLoader@61de33
当我们修改 System.out.println("hahaha?"); ---> System.out.println("changed? "); 编译LocalClass后
输出变为:
changed
classloader.DynamicClassLoader@173a10f

在loadClass中, 我们必须重新初始化一个ClassLoader,否则就会违背同一个ClassLoader是不允许多次加载一个类的。
当然,容器的实现机制肯定要完善,不可能周期性的加载,可能回通过监听机制,动态加载修改过的类。但它的实现机制肯定也是重新 实例化一个ClassLoder,加载需要加载的类。

读书人网 >编程

热点推荐