日期:2014-05-20  浏览次数:20633 次

200分给予解答:如何实现JVM类重新加载?
去年有一款产品“jrebel”可以实现运行时的类重新加载(包括方法的新增和删除),大家都知道JVM使用Application ClassLoader来加载放在classpath下的类,而且只加载一次下次在访问就会从缓存中取,所以要实现类重载只能是重新创建一个新的ClassLoader在来加载变化后的class。
问题:
1、JVM是在什么时候创建类的ClassLoader
2、创建自己的ClassLoader没什么问题,但是创建后的ClassLoader如何注册到JVM中呢?

不知道有没有JVM的高手可以解答这个问题

注意:此贴并是不讨论如何创建自定义的ClassLoader,而是需要一个JVM的钩子能够实现的需要时自动创建ClassLoader来达到类的重新加载的功能。


------解决方案--------------------
帮你顶下吧,还真的要JVM比较熟悉才能回答你
------解决方案--------------------
这个没研究过,我还是个初级程序员
------解决方案--------------------
比较好的题目,不过还未考虑过这个问题,帮顶
------解决方案--------------------
这个可能和一些application server中每个application都有各自classloader相似。

那些server实现了自己的classloader但是也没有在JVM里面注册。每次reload application的时候程序控制了自己定义的classloader重新加载的动作。我觉得这种reload(或者hot deployment)机制可能和您想要的效果差不多。
------解决方案--------------------
jvm类加载用的是至上到下的方法,如 baseloader基本-----systemloader---系统
------extloader扩展
你要在用个加载类的话一般是系统加载类的子类,如要它指定是加载一个test类, 当这个test类改变后你想热改变这时你不能用这个类了,应为他以存有test类的信息不会在去加载,你可以在new一个类加载由systemloader做父加裁器。在加载test。返回class 在new出来就成了改变后的类了
------解决方案--------------------
Java code
java.net.URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();

.....

Class sysclass = URLClassLoader.class;
        try {
            Method method = sysclass.getDeclaredMethod("addURL", new Class[] { URL.class });
            method.setAccessible(true);
            method.invoke(sysLoader, u);
        } catch (Throwable t) {
            t.printStackTrace();
}

------解决方案--------------------
你可以看看jvm内部 的一些脚步开发。可能对你有帮助。自己这几天也想研究下呢
------解决方案--------------------
不懂楼主的意思,顶下吧!!!!!!!
------解决方案--------------------
http://www.blogjava.net/Unmi/archive/2008/10/22/235823.html

URL[] externalURLs = new URL[]{new URL("file:../TestHotDeployImpl/bin/")};
cl = new URLClassLoader(externalURLs);
catClass = cl.loadClass("com.unmi.CatImpl"); 


------解决方案--------------------
接分+路过+学习。。。