2011-09-01 35 views
1

在JDI中,有一個API可以從JPDA使用的JVM中的已處理事件中排除事件。這是通過使用:JDI/JPDA事件篩選

  1. addExclusionFilter(String)排除一些模式;例如addExclusionFilter("java.*")
  2. addClassFilter(String)包括一些模式;例如addClassFilter("java.util.*")

現在,我需要兩個。我需要排除來自"java.*"的所有事件,但我需要接收來自"java.util.Iterator"的事件。

此外,請注意,例如java.util.Iterator是由java.util.AbstractList中的某些私人類實現的接口。我們如何收到這樣的活動java.util.Iterator

當我使用兩種方法時,我實際上不要接收事件了。你有一個想法如何做到這一點?提前致謝。

+0

你是什麼意思「我實際上接收事件了嗎? – janetsmith

+0

對不起,這是我的錯,更新的問題。 – nobeh

+0

對於接收「java.util.Iterator」事件addClassFilter(「java.util.Iterator」)就足夠了。您的方法無法正常工作,因爲您已通過在「java。*」上應用排除過濾器排除了「java.util.Iterator」。 – rainyday

回答

1

您可以使用將ReferenceType作爲參數的addClassFilter方法,該方法(與String-arg版本不同)匹配給定類型的任何子類型。使用jdiscript和Java 8時,在迭代器方法調用上觸發可能看起來像這樣:

public static void main(String[] args) { 
    JDIScript j = new JDIScript(new VMLauncher(OPTIONS, MAIN).start()); 

    OnVMStart start = se -> { 
     List<ReferenceType> rts = j.vm().classesByName("java.util.Iterator"); 
     j.methodEntryRequest(me -> { 
      println("Your handler here"); 
     }).addClassFilter(rts.get(0)) 
      .enable(); 
    }; 

    j.run(start); 
}