JDI / JPDA事件过滤

时间:2011-09-01 15:19:59

标签: java jpda jdi

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

完成的
  1. addExclusionFilter(String)排除某些模式;例如addExclusionFilter("java.*")
  2. addClassFilter(String)包含一些模式;例如addClassFilter("java.util.*")
  3. 现在,我需要两者。我需要排除来自"java.*"的所有活动,但我需要接收来自"java.util.Iterator"的活动。

    另请注意,例如java.util.Iterator是由java.util.AbstractList中的某个私有类实现的接口。我们如何向java.util.Iterator收到此类活动?

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

1 个答案:

答案 0 :(得分: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);
}