zoukankan      html  css  js  c++  java
  • JAVA编程之动态更新JVM中的class文件

         可能平时工作中我们需要经常更新一下CLASS文件,本文简单介绍一下如何动态更新JVM中的class文件,希望对各位朋友们有所帮助吧---

           在一个运营系统中,如果出现业务方法变更,而我们使用的应用服务器不支持热部署的话,那么重启可能是更新的唯一选择。目前多数应用服务器不支持热部署,包括生产模式下的weblogic。之所以说是生产模式,weblogic在开发模式下是支持这种动态更新的,即我们只要替换部署目录下的类文件,重新访问时可以看到新业务方法生效,而且即使在生产模式下,weblogic也能"支持"动态更新,但做法上比较麻烦,需要使用version信息控制应用,这个功能weblogic9就开始提供,但好像很少有客户这么用过。如果应用服务器不支持动态更新,我们有什么方法可以满足这种需求吗? 这就是我们这篇文章要讲述的,通过TI(更准确地说是JDI),我们可以实现。

      为了能够正确的做到动态更新,我们首先需要attach到target JVM上.

      连接上target JVM后,我们可以就可以利用vm提供的redefineClasses()将新的类文件注入到JVM中,替代原有的class信息。

      1     public void reloadClasses(List toReloads){

      2         Map toReloadMap = new HashMap();

      3         for (Iterator iterator = toReloads.iterator(); iterator.hasNext();)

      4         {

      5             String toReload = (String) iterator.next();

      6             InputStream is = VMDebugger.class.getClassLoader().getResourceAsStream(toReload.replace('.', '/') + ".class");

      7             if (is == null) {

      8                 throw new RuntimeException("Class " + toReload + " is not found in current classpath");

      9             }

      10             List classes = vm.classesByName(toReload);

      11             if (classes == null || classes.isEmpty()) {

      12                 throw new RuntimeException("Class: " + toReload + " is not found in target JVM");

      13             } else {

      14                 ReferenceType ref = (ReferenceType) classes.get(0);

      15                 try{

      16                     toReloadMap.put(ref, toByteArray(is));

      17                 }catch(Exception e){

      18                     e.printStackTrace();

      19                 }

      20             }

      21         }

      22         vm.redefineClasses(toReloadMap);

      23     }

      上面的方法有如下几个注意的地方:

      1:确保要更新的类在当前classpath下(也就是启动VMDebugger的classpath)。

      2:确保要更新的类在target JVM已被大众搬场加载。

      3:不同的VM实现上不一样,有的可能不允许动态更新,可以使用canRedefineClasses()

      判断一下。

    虹口鲜花/闸北保洁公司/崇明租车/嘉定汽车租赁/黄浦婚庆礼仪/绿化租赁/封口机/多级泵/调节阀/升降机/弯头/数控铣刀/注册公司/装修公司/空调维修/代开发票

  • 相关阅读:
    LeetCode Reverse Integer
    LeetCode 3Sum Closest
    LeetCode Remove Duplicates from Sorted Array
    解决git 远程删除分支之后,vscode本地分支列表没有更新问题
    reduce, filter, map, forEach 使用
    ehcarts tooltip 自定义展示. 展示小图例
    vscode插件,代码块,快捷键 入门
    DorisSQL与MySQL函数对照 差异篇
    Doris与mysql语法对照,差异篇
    功能测试报告模板
  • 原文地址:https://www.cnblogs.com/lanxin258/p/2385608.html
Copyright © 2011-2022 走看看