为了账号安全,请及时绑定邮箱和手机立即绑定

如何动态更新JVM中的class文件?

/ 猿问

如何动态更新JVM中的class文件?

JVM
Cats萌萌 2018-10-13 15:09:14

如何动态更新JVM中的class文件


查看完整描述

1 回答

?
慕标琳琳

为了能够正确的做到动态更新,首先需要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()判断一下。



查看完整回答
反对 回复 2018-11-08
  • 1 回答
  • 0 关注
  • 402 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信