引入:

上篇文章从整体上来看待JDI协议,这里结合Eclipse的实现代码来讨论下JDI的Mirror机制。


分析:

镜像机制是将目标虚拟机上的所有数据、类型、域、方法、事件、状态和资源,以及调试器发向目标虚拟机的事件请求等都映射成 Mirror 对象。其思想和我们经常说的O/R Mapping一样,其主要思想就是把2个异构的系统中的事物统一起来。


Mirror接口是JDI规范中定义的主接口,它位于com.sun.jdi包中:

public abstract interface Mirror
{
  public abstract String toString();
  public abstract VirtualMachine virtualMachine();
}

这个接口只提供了2个方法,一个是返回该镜像的字符串描述,一个是获取某镜像的实例的虚拟机。


Mirror机制定义了一个庞大的接口hierarchy, com.sun.jdi包中定义的几乎所有接口都直接或者间接继承了Mirror接口,从而把庞大的Debug过程中用到的任何元素,过程,事件都映射起来。

比如基本类型的值被映射为PrimitiveValue, 对象实例被映射为ObjectReference等。


在Eclipse中,它提供了MirrorImpl的镜像实现类,其中获取镜像虚拟机的代码是读取成员变量fVirtualMachineImpl字段,该字段在构造器中初始化:

public MirrorImpl(String description)
  {
    this.fDescription = description;
    this.fVirtualMachineImpl = ((VirtualMachineImpl)this);
    PrintWriter writer = ((VirtualMachineManagerImpl)
      Bootstrap.virtualMachineManager()).verbosePrintWriter();
    if (writer != null)
      this.fVerboseWriter = new VerboseWriter(writer);
  }


虚拟机类提供了许多方法来直接或间接地获取目标虚拟机上所有的数据和状态信息,也可以挂起、恢复、终止目标虚拟机。这样调试器就可以通过某个Mirror,然后间接获得对应虚拟机,并且发送相应指令来完成相应操作了。