ty9919 发表于 2018-12-6 14:09:39

tomcat 5.5 动态加载类

  转载于:http://www.itxuexiwang.com/a/javadianzishu/tomcat/2016/0225/161.html?1456480735
  开发使用的是tomcat5.5.27,对于WEB-INF/classes下面的类做了修改,tomcat就会就会自动重启,然后紧接着就是内存溢出。调试比较麻烦。昨天研究了一下tomcat的源代码,对类的加载机制作了一点点修改,让它动态加载类,这样调试的时候如果修改了java文件就不用重启 tomcat了。具体步骤如下:
  修改WebappClassLoader.java文件中的modify()方法,
  在745行的
  return (true);注销,修改为:
  // return (true);
  //做了修改,重新装载
  this.reloadresource(i);
  return false;
  然后添加一个对方法reloadresource的实现:
  /**
  * 重新装载的动作包括:
  * 1。重新装载
  * 2。更新最新时间
  * @param i
  */

  private void>  String path = paths;
  String tclassName = path.replaceAll(this.repositories, "");
  String name = tclassName.replaceAll("/", ".").replaceAll(".class", "");
  resourceEntries.remove(name);
  this.findResourceInternal(name, tclassName);
  System.out.println("重新加载了类文件:"+tclassName);
  long lastModified =
  ((ResourceAttributes) resources.getAttributes(path))
  .getLastModified();
  lastModifiedDates = lastModified;
  //从这里加载的相当于多在paths和lastModifiedDates中多添加了冗余记录,需要删除最后一个
  synchronized (allPermission) {
  int j;
  long[] result2 =
  new long;
  for (j = 0; j < (lastModifiedDates.length - 1); j++) {
  result2 = lastModifiedDates;
  }
  lastModifiedDates = result2;
  String[] result = new String;
  for (j = 0; j < (paths.length - 1); j++) {
  result = paths;
  }
  paths = result;
  }
  }
  这样就可以动态的由tomcat来加载类了。

页: [1]
查看完整版本: tomcat 5.5 动态加载类