1

在 JDI 中,有一个 API 可以从 JPDA 使用的 JVM 中已处理的事件中排除事件。这是使用以下方法完成的:

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

现在,我两个都需要。我需要排除来自的所有事件,"java.*"但我需要接收来自"java.util.Iterator".

另外,请注意,例如java.util.Iterator是由java.util.AbstractList. 我们如何接收此类事件java.util.Iterator

当我使用这两种方法时,我实际上不再接收事件了。你知道怎么做吗?提前致谢。

4

1 回答 1

1

您可以使用将 ReferenceType 作为参数的 addClassFilter 方法,该方法(与 String-arg 版本不同)匹配给定类型的任何子类型。使用jdiscript和 Java 8,触发 Iterator 方法调用可能看起来像:

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);
}
于 2014-03-20T02:12:06.960 回答