请教:应用服务器如何识别被更新的class文件,是通过ClassLoader吗?
我拿Tomcat5.0.28做的试验
public class Test{
static int a = 99;
static{
a = 5662;
System.out.println("类初始化");
}
public Test(){
System.out.println("创建了一个TTTTT的实例");
}
public static void stm(){
System.out.println("--------static-------!"+a);
}
public void m(){
System.out.println("--------nonstatic-------!"+a);
}
protected void finalize() throws Throwable {
super.finalize();
System.out.println("--------对象被释放---------!");
}
}
将创建一个Test类的对象,放到session中,
会打印出:
类初始化
创建了一个TTTTT的实例
然后执行m方法,打印出("--------nonstatic-------!5662
然后修改Test类,将m方法改为:
public void m(){
System.out.println("----modified----nonstatic-------!"+a);
}
再次执行,打印出的就就是新的方法中的内容:----modified----nonstatic-------!5662
但是没有打印出“类初始化”,也就是说没有执行static初始块。
同样的试验,发现static的方法也是被更新后的。
同时,我也尝试打印出Test.class.hashcode();,发现这个值一直没有变,这个方法是来自Object,Class类并没有override它,还有一些发现,我总结了一下tomcat的特点:
*Tomcat会识别应用目录下Class文件的更新操作,并通过某种机制将新的字节码替代旧的字节码
*Tomcat不会重新加载一个类,因为static块没有被执行
*Tomcat动态更新不允许增加方法、减少方法、增加/减少字段等操作。这些操作都会引起Tomcat崩溃。
至于Tomcat对servlet的更新相对就简单一些了,毕竟servlet实现了接口,而且都是完全由容器管理的,创建、更新、再次加载在理论上也都不是什么难事。可是对于Test这种完全自定义的类,实现动态更新让我困扰不已。小弟尝试从ClassLoader的角度分析这个问题,但是最后发现那样是没有办法达到这种效果的。小弟也尝试从Class类入手,现在还没有结果,请问哪位大虾能给小弟指点迷津,小弟不胜感激!