天天看点

JPDA 架构研究18 - JDI的Mirror机制

引入:

上篇文章从整体上来看待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);
  }