Jvm 重复加载同一个类的结果会怎么样?

09-06-03 ofbiz
如题。。。 ,就像 hot deploy 一样,如果一个类修改了,我想让 jvm 重新加载,怎么处理,会与之前加载过的类冲突吗?

[该贴被ofbiz于2009-06-03 14:17修改过]

ofbiz
2009-06-04 09:48
晕,竟然没人回,ClassLoader 是 server 自定义的加载器,它们是只加载修改过的类,还是全部加载的?

beepbug
2009-06-04 18:38
我看Java书里说,类是第一次被使用时才加载到内存。

你说类已经被加载,是不是说类已被使用?而此时你修改了类文件?想让JVM再加载一次,以刷新内存里的映象?

有这样的业务需求嘛?

ofbiz
2009-06-05 09:12
这个不是工作上的,是我自己这样想的

yellowcat
2009-06-06 09:37
可以,不过要先卸载,具体卸载的方法是

1.把自定义类加载器的对象=null

2.把这个类加载器的加载的所有Class对象=null

3.把所有Class对象用newInstance()方法生成的对象=null

这样虚拟机就卸载了你通过自定义类加载器加载的类了

ofbiz
2009-06-06 10:38
你说的卸载的加载器的那个对象,言外之义就是说我要重新去创建一个新的加载器对像吗? 我要是重新重新创建一个加载器对象,它所加载的类之间应该是没关系的吧,不同的类加载器,所加载的类都有不同的命名空间是吧,不知道像 tomcat 在 hot deploy 的时候,是怎么处理的? 如果哪们知道 tomcat 部署的原理,希望分享一下,谢谢 !

yellowcat
2009-06-08 10:56
// 在此输入java代码
public class KillThenDisappear {
	public static void main(String[] args){
		String path = "c:/KillClasses/";
		String classname = "KillWithKnife";
		
		KillClassLoader kcl = new KillClassLoader(path);
		
		//此刻加载了KillWithKnife
		Class c = kcl.loadClass(classname);
		
		Object o = c.newInstance();
		
		//......此段使用这个o
		
		//Then Disappear(这里只要做到以下三点,KillWithKnife类就被卸载了)
		kcl = null;
		c = null;
		o = null;
		
		
		//注意,这里又可以重新加载类KillWithKnife进jvm了
		kcl = new KillClassLoader(path);
		
		//此刻又加载了KillWithKnife
		c = kcl.loadClass(classname);
		
		o = c.newInstance();
		
		//又可以用这个o了
	}
}
<p>

这样就可以实现动态加载了

[该贴被yellowcat于2009-06-08 10:57修改过]

猜你喜欢