在程序中怎样重新加载类啊?

juyib 2005-03-17 08:20:19
比如运行程序,发现其中的一个class有了新版本要更新
如何在不停止整个程序的情况下更新这个class啊?
谢谢
...全文
132 点赞 收藏 21
写回复
21 条回复
DanielYWoo 2005年03月21日
你的这种需求很常见的,你看看这个文章,很简单的
http://www-106.ibm.com/developerworks/edu/j-dw-javaclass-i.html?S_TACT=105AGX02&S_CMP=EDU
回复 点赞
DanielYWoo 2005年03月21日
>>因为java spec上说class unload的虚拟机实现是可选的,
这句话没错

>>而reload又必须先unload再load。
这就好像不对了。目前几乎所有的JVM都有支持reload的。
通常你把所有对某个Class的可达(reachable)引用消除之后,把Classloader也给释放掉,那么这个Class就可以被gc。Tomcat,WebLogic这些AppServer为什么可以再不重新启动的情况下部署一个servlet,也可以undeploy一个servlet,还可以替换一个servlet,就是这个原因,AppClassloader代理了对WebApp下面的所有的类的加载。ClassLoader是树形的向上查找的,如果你在App Server classpath里的类被你的WebApp用到,那么WebApp先找App classloader,没找到,然后才找System Classloader.如果是java的核心类,那就是Bootstrap加载的啦,那是一个用C写的本地classloader.

回复 点赞
juyib 2005年03月21日
这样讲吧,将class放在一个数据块中传送,数据块本身带有版本属性,在接收端将数据块拼起来,构造出程序并运行。由于数据不停传送,有可能更新。这样就需要替换以前数据块中传过来的类。
我已经知道这个好像不能做到。因为java spec上说class unload的虚拟机实现是可选的,而reload又必须先unload再load。目前只有少数虚拟机可以unload,reload.
回复 点赞
zhyjxy 2005年03月21日
学习中
回复 点赞
喝酒吃肉 2005年03月18日
这个应当是容器管理的吧
回复 点赞
escalj 2005年03月18日
有点不明白你要的是什么效果。】
我的理解是:
可以设计一个用于判断的方法来判断版本,该方法包含一个判断版本的标志。
然后在run-time根据标志来重新将引用定位到你需要版本的类。
回复 点赞
Hodex 2005年03月18日
有创意~~
回复 点赞
xinghunhun 2005年03月18日
给分就有答案
回复 点赞
greennetboy 2005年03月18日
不可能吧,必须要停止程序运行才能更换的吧
回复 点赞
asa516 2005年03月18日
不是太明白你的意思.
回复 点赞
yuepengfei 2005年03月18日
楼主的做法应该是不可行的
回复 点赞
juyib 2005年03月18日
再顶一下
回复 点赞
OnlyFor_love 2005年03月18日
把你的类import进来就可以了!
回复 点赞
DanielYWoo 2005年03月18日
这是一个很简单的问题。你需要自己用URLClassLoader把你要的类加载进来,或者你也可以用你自己写的ClassLoader. 看看下面这个东东你就明白了
http://www-106.ibm.com/developerworks/edu/j-dw-javaclass-i.html?S_TACT=105AGX02&S_CMP=EDU
回复 点赞
shan1119 2005年03月17日
不可能把,不停程序怎么编译?
回复 点赞
hzy111 2005年03月17日
路过,关注中 ... ...
回复 点赞
enrico 2005年03月17日
不懂
回复 点赞
juyib 2005年03月17日
谢谢,继承是可以,但不直接,没有其他方法了么?
回复 点赞
randycn 2005年03月17日
这个不知道
回复 点赞
jverson 2005年03月17日
不了解,还是帮你顶
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告