Zorka源码阅读与讲解(2)怎样实现Online Reconfiguration?

也同样是想通过这篇日志,讲讲在Java中怎么实现插桩的在线配置和管理。在之前这篇日志中,我简单介绍了Online Reconfiguration的基本效果,这里讲讲Zorka是怎么实现的(其实远比大家想想的要简单)。

之前那篇日志中我讲过,我们就从reload这个方法入手。最简单的方法是,直接在Eclipse中搜索reload这个方法。Search——File——Containing Text中填入reload,然后在Scope中选择Enclosing Projects,点Search,就会出现一些match的结果,我们简单浏览一下,发现有个类叫ZorkaControlMBean,,点开一看,发现只是个接口。我们在这个接口的名字上点右键——References——Project,就可以看到原来只有一个ZorkaControl类实例化了这个接口,看到这个类的reload方法只是调用了AgentInstance的对象的同名方法。

所以我们只需要看看AgentInstance这个类的reload方法:这个方法读起来也很简单,我就不详细展开介绍了,唯一需要注意的就是这条语句:

getRetransformer().retransform(oldSet, newSet, false);我们可以看到,实际上就是这条语句实现了真正的Reconfiguration,按照一样的方法,可以找到retransform这个方法实际上是在RealSpyRetransformer的retransform这个方法中进行了实现,AgentInstance这个类中的成员变量:private SpyRetransformer retransformer;实际上是RealSpyRetransformer这个类的对象。我们看一下RealSpyRetransformer这个类中的retransform这个方法,重点看一下这一条语句:instrumentation.retransformClasses(classes.toArray(new Class[0]));

原来直接调用的是instrumentation对象的retransformClasses这个方法。关于这个方法,我们可以参看这里:对这个方法的介绍:This function facilitates the instrumentation of already loaded classes. When classes are initially loaded or when they are redefined, the initial class file bytes can be transformed with the ClassFileTransformer. This function reruns the transformation process (whether or not a transformation has previously occurred). 看到这里相信大家就都明白了,原来Zorka说到底只是调用JDK的标准API实现了Online Reconfiguration。需要指出的是,这个方法是JDK 1.6之后才增加的,并不适用于JDK 1.5。

关于这些方法从JDK 1.5到8.0的演化,大家可以参看一下链接:

可以看到,从JDK 1.5中,这个接口只有7个方法,从JDK 6开始稳定在15个方法。

放下一处烦恼,收获一个惊喜;放下一种偏见,收获一种幸福;

Zorka源码阅读与讲解(2)怎样实现Online Reconfiguration?

相关文章:

你感兴趣的文章:

标签云: