引入:java
上篇文章從總體上來看待JDI協議,這裏結合Eclipse的實現代碼來討論下JDI的Mirror機制。app
分析:ide
鏡像機制是將目標虛擬機上的全部數據、類型、域、方法、事件、狀態和資源,以及調試器發向目標虛擬機的事件請求等都映射成 Mirror 對象。其思想和咱們常常說的O/R Mapping同樣,其主要思想就是把2個異構的系統中的事物統一塊兒來。this
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,而後間接得到對應虛擬機,而且發送相應指令來完成相應操做了。ip