概述
不停止JVM动态更新Java类,到底有什么用处?
对于大多数WEB程序这个功能并没有什么意义,这里假设在桌面系统以及服务器的情况:
桌面软件,当用户在线升级程序后,需要将最新的Java类动态提取到当前的classloader以供用户使用最新状态的程序
桌面软件,当需要各种插件时,需要从设定文件中提取信息,并在启动时提取。而这种提取需要在程序启动之后,例如Eclipse
Servlet容器,动态提取最新状态的jar包、Servlet类、JSP类以及设定文件等
不停止JVM动态更新Java类功能,显然在很多地方是必不可少的。以下笔者将以代码的形势演示如何实现此功能。
代码:
package org.logical_paradox.reloader;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
/**
* @author satoshi akabane
* @version $Revision$
*/
public class Reloader {
public static final String REPOSITORY = "./lib/";
private Reloader() {
}
public static final void main(String[] args) throws Exception {
Reloader reloader = new Reloader();
ClassLoader current = Thread.currentThread().getContextClassLoader();
// v1
log("HelloWorldLogic_v1 is now loading.");
ClassLoader loader = reloader.load(REPOSITORY + "HelloWorldLogic_v1.jar");
Thread.currentThread().setContextClassLoader(loader); // switch context class loader
Object objv1 = loader.loadClass("HelloWorldLogic").newInstance();
Method method = objv1.getClass().getMethod("getHello", new Class[0]);
// getHello()
Object msg = method.invoke(objv1, new Object[0]);
log("answer from v1 is [" + msg.toString() + "]");
// v2
loader = null;
log("HelloWorldLogic_v2 is now loading.");
loader = reloader.load(REPOSITORY + "HelloWorldLogic_v2.jar");
Thread.currentThread().setContextClassLoader(loader); // switch context class loader
Object objv2 = loader.loadClass("HelloWorldLogic").newInstance();
method = objv2.getClass().getMethod("getHello", new Class[0]);
// getHello()
msg = method.invoke(objv2, new Object[0]);
log("answer from v2 is [" + msg.toString() + "]");
Thread.currentThread().setContextClassLoader(current);
}
private static final void log(String msg) {
System.out.println("log: " + msg);
}
private URLClassLoader load(String jarname) throws Exception {
final String base = (new File(jarname).getCanonicalFile().toURL()).toString();
URL url = new URL("jar:" + base + "!/");
URLClassLoader loader = new URLClassLoader(new URL[]{url});
return loader;
}
}
执行结果:
[java] log: HelloWorldLogic_v1 is now loading.
[java] log: answer from v1 is [version 1]
[java] log: HelloWorldLogic_v2 is now loading.
[java] log: answer from v2 is [version 2]
最后
以上就是长情星月为你收集整理的java更新停止程序_不停止JVM动态更新Java类的全部内容,希望文章能够帮你解决java更新停止程序_不停止JVM动态更新Java类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复