如何动态更新JVM中的class文件Java认证考试

文章作者 100test 发表时间 2010:01:01 15:47:07
来源 100Test.Com百考试题网


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

  编辑特别推荐:

  指点一下:到底该不该去考JAVA认证?

  Java面试题:第一锦

  Java面试题:第二锦

  Java面试题:第三锦

  Java面试题:第四锦

  Java面试题:第五锦

  一个有趣的编程:程序员的爱情故事



相关文章


在Java中实现对象比较Java认证考试
销毁对象的三把利剑Java认证考试
javascript验证日期的函数Java认证考试
Servlet的Cookie值保存与获取Java认证考试
如何动态更新JVM中的class文件Java认证考试
J2ME经典算法地图四色问题Java认证考试
JAVA认证辅导:jsp端使用ApplicationContextJava认证考试
用JavaMail发送带附件的EmailJava认证考试
如何高效使用JavaEEORM框架Java认证考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛