博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java更新停止程序_不停止JVM动态更新Java类
阅读量:6453 次
发布时间:2019-06-23

本文共 2248 字,大约阅读时间需要 7 分钟。

不停止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]

转载地址:http://dcyzo.baihongyu.com/

你可能感兴趣的文章
MySQL my.cnf参数配置优化详解
查看>>
HDU/HDOJ 2102 A计划 广度优先搜索BFS
查看>>
JavaNIO基础02-缓存区基础
查看>>
阿里 Blink 正式开源,重要优化点解读
查看>>
日本开设无人机专业,打造无人机“人才市场”
查看>>
Exchange 2013 EAC之管理员重置普通用户密码
查看>>
三线跑酷例子BlocksRun的技术点
查看>>
如何应对DDOS网络攻击
查看>>
新闻奖颁给了一个写稿机器人(来自新华社)
查看>>
Android应用程序在新的进程中启动新的Activity的方法和过程分析
查看>>
spring boot 拦截器
查看>>
数组和指针
查看>>
Python version 2.7 required, which was not found in the registry
查看>>
Oracle 学习之--ASM DISK Header的备份和恢复(1)
查看>>
Oracle Study之案例--Oracle ASSM管理方式下的BITMAP
查看>>
根据umask值,计算文件权限
查看>>
VLSM规划
查看>>
How to upgrade the ant built into eclipse?
查看>>
在线BASE64加密解密、UrlEncode编码/解码、native/ascii在线转换工具
查看>>
CentOS 6.3 安装 JDK
查看>>