引入:
上篇文章從整體上來看待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);
}