把一个已经编译好的工程文件放到tomcat下面,启动tomcat后,工程可以正常运行,当我把工程里面的某个class文件用另外一个正确的class文件替换后,没有重启tomcat,它为什么不执行替换后的class,还是照样执行已经被替换的class呢?
难道一定要重启tomcat 吗?
我的工程在执行到一半时在tomcat的工程目录下生成一个新的class替换以前的class,接着就执行这个新生成的class;
如果要重启tomcat,那我不是要在工程执行到一半时,reload一下,再继续执行工程,这样好像不行吧,所以我想不重新加载class,而直接执行新的class
不知是否可行?
[b]问题补充:[/b]
to bluespring :其实我就是用的你方法,我生成一个新的class的时候,程序可以执行这个class,我遇到的问题是:当我第二次来生成与已经执行过的class同名的新的class时,替换这个class后,程序还是执行的以前的class,所以还要reload一下。
对于java虚拟机而言,一个class被classLoader加载一次后就会常驻内存知道虚拟机终止。
你修改后的class不会再次加载
而weblogic等web容器重新实现了classLoader能够支持热部署即重新加载修改的class,
网上所谓的tomcat热部署不过是重启被修改class的应用而不重启整个tomcat,不能实现你的需求
所以在tomcat下修改class是无论如何都做不到热部署的
只能另想办法
如果你的class只修改一次或固定几次,用Interface的方式调用
Interface YourIface;
Class yourOldClass implement YourIface;
YourIface obj=new YourOldClass();
使用了一些 YourIface的方法;//oldClass
创建新的class,class实现YourIface
Class yourNewClass implement YourIface;
obj=new YourNewClass();
使用了一些 YourIface的方法;//newClass
tomcat不支持热部署,不能完成你需要的功能
有个思路你可以试试
你可以将你要的功能做成Interface,在新class生成后,要是用新class的时候将接口实现换为新class