快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
lements Cat {   @Override    public void miaow() {     System.out.println("I''m Hello Kity, I like play with you.");     //System.out.println("I''m Tom, Jerry always kids me.");   }  }  package com.unmi; /** * Cat 的实 现类,观察是否加载了最新代码,可通过改变 miaow() 方法的输出 * @author Unmi */ public class CatImpl implements Cat { @Override public void miaow() {  System.out.println("I''m Hello Kity, I like play with you.");  //System.out.println("I''m Tom, Jerry always kids me."); } }

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

时间:2011-08-31

2. 进行测试

运行 TestHotDeployInf 中的 Client 程序,按照下图中的指令说明,可观察 到热加载的过程:

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

3. 几个问题

1) 为什么要在单独的工程里放置 CatImpl 类(重要)

主要是为了编译成的 CatImpl 类对于 TestHotDeployInf 的系统加载类不可 见,就是不能放在 TestHotDeployInf 的程序的 classpath 中。

这个问题可以说大,本应该提高一个层次来说明它。前面提过标准 Java 启动 器加载器层次中有三个加载器,而在上面的 Client.java 中,我们看到用了一个 自定义的 cl = new URLClassLoader(externalURLs) 类加载器来加载 com.unmi.CatImpl。也就是标准的类加载器又多了一层,这里估且把它叫做应用 程序加载器(AppClassloader)。

根据委托规则,执行 Client 时,要加载 com.unmi.CatImpl 时会首先委托加 载 Client 类本身的系统加载器加载。如果编译出的 CatImpl.class 放在 Cat.class 相同的位置,那么就由系统加载器来加载 com.unmi.CatImpl,自定义 加载器 cl 是没机会了。所以必须放在外面让系统加载器看不到 com.unmi.CatImpl 类。

再依据一致性规则,如果系统加载器能加载了 com.unmi.CatImpl 类,以后你 怎么修改 CatImpl 类,替换掉原来的类,内存中总是最先加载的那个 com.unmi.CatImpl 类版本。因为类只会加载一次。而用自定义的 cl 可不一样了 ,每次执行 cl.loadClass("com.unmi.CatImpl") 时都是用的一个新的 ClassLoader 实例,所以不受一致性规则的约束,每次都会加载最新版本的 CatImpl 类。

2)关于类的卸载的问题

上一条讲了加载 com.unmi.CatImpl 时,每次都 new 了一个新了 ClassLoader 实例,每次都加载最新的 CatImpl 类,那就引出了不再使用的 ClassLoader 实例和早先旧版本的 CatImpl 类实例的回收问题。在多数 JVM 中 ,它们如同普通的 Java 对象一样的处理,当它们无从触及时被当作垃圾被收集 掉。也可能在某些 JVM 中这种情况对 ClassLoader 和旧版本 Class 实例的回收 要特殊关照一下。

这里的 Class 实例,就是对象调用 getClass() 得到的实例,如 CatImpl.getClass()。类实例和类加载器是相关联的,所有会出现这样的问题, 相同类的静态变量可能表现为不同的值,因为它们可能是由不同的类加载器加载 的。

对于 ClassLoader 确未细细深入,其实要展开的话内容也不多,关键就知道 两点(还是回到了前面的两点,等于什么都没说哦):

1)了解你的程序的类加载器层次,应该看看常见应用服务器(如 Tomcat) 的类 加载器层次

2) 理解类加载器的三个规则,着重理解委托机制

知道了类加载器层次,你就可以进行一些定制。如可以把一些包丢到 jre/lib/ext 中就能使用到;给 java 用参数 -Xbootclasspath 指定别的类或包 就能替换掉 Java 核心 API 了。

对于可见性规则可以举两个例子:

1) 对于标准的类加载器层次,放在 jre/lib/ext 中的类(由扩展类加载器加 载)可以让放在 classpath 下的类(由系统类加载器加载) 访问到,反过来

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号