快速业务通道

类的热加载(Hot Deployment)的简单例子 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

类的热加载(Hot Deployment)的简单例子

时间:2011-08-31

应用服务器一般都支持热部署(Hot Deployment),更新代码时把新编译的确类 替换旧的就行,后面的程序就执行新类中的代码。这也是由各种应用服务器的独 有的类加载器层次实现的。那如何在我们的程序中也实现这种热加载功能呢?即 要在虚拟机不关闭的情况下(比如一个),换个类,JVM 就知道加载这个新类,执 行新类中的逻辑呢?下面就简单演示这样一个热加载的例子,首先大致了解一下 类加载器。

标准 Java 启动器的类加载器层次

1. 引导类加载器(bootstrap):  加载内核 API,如 rt.jar(java.lang、 java.io 等)

2. 扩展类加载器(extension):  加载的默认扩展来自于 jre/lib/ext

3. 系统类加载器(system):    类路径上的类,如 com.unmi.*

说明:这只是标准 Java 启动器运行程序时的类加载器层次,像应用服务器中 的类加载器通常会多一两层,也是在这个基础上的延伸。上面的类加载层次存在 自上而下的委托关系,委托加载不在这里细讲。

类加载器的规则有三

1. 一致性规则:类加载器不能多次加载同一个类

2. 委托规则 :在加载一个类之前,类加载器总参考父类加载器

3. 可见性规则:类只能看到由其类加载器的委托加载的其他类,委托是类的 加载器及其所有父类加载器的递归集。(这个规则可能不太好理解,要举个例子就 很容易理解的,这里也不细说)

实际的例子演示热加载

1. 建立工程,编写代码

前面铺垫的应该够厚了,开始用个例子来说明感受类的热加载(又名热部署 Hot Deployment)。这个例子采用 Eclipse 来做,首先要建立两个普通的 Java 工程,分别是 TestHotDeployInf 和 TestHotDeployImpl。让 TestHotDeployImpl 依赖于 TestHotDeployInf 工程,即在 TestHotDeployImpl 的 Build Path 中,Projects 标签页里把 TestHotDeployInf 工程选进来,因为 编译 TestHotDeployImpl 中的类要用到 TestHotDeployInf 中的类。

然后在工程式 TestHotDeployInf 中新建一个接口(Cat.java) 和一个类 (Client.java),内容分别是:

类的热加载(Hot Deployment)的简单例子(2)

时间:2011-08-31

Cat.java(Cat 接口类,也可以用抽象类,用来引用需热加载的实现类的实 例)

package com.unmi; /**  * Cat 接口,要热加载的类一定要有一个 接口或基类引用 * @author Unmi  */ public interface Cat {   public void miaow(); }  package com.unmi; /** * Cat 接 口,要热加载的类一定要有一个接口或基类引用 * @author Unmi */ public interface Cat { public void miaow(); } Client.java(测试热加载的客户端类) package com.unmi; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLClassLoader; /**  * 测试热部 署 Hot Deployment 的客户端类  * @author Unmi  */ public class Client {   private static ClassLoader cl;   private static Class catClass;   /**     * @param args     */   public static void main(String[] args) throws Exception{     BufferedReader br = new BufferedReader(new InputStreamReader (System.in));     Cat cat = createCat();      System.out.println("miaow, reload, or exit");     while(true) {       String cmd = br.readLine();       if (cmd.equalsIgnoreCase("exit")){         return;        } else if(cmd.equalsIgnoreCase("reload")){          reloadImpl();         cat = createCat();          Syst

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号