Фильтрация событий JDI / JPDA - PullRequest
       61

Фильтрация событий JDI / JPDA

1 голос
/ 01 сентября 2011

В JDI есть API для исключения событий из обработанных событий в JVM, используемых 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?

Когда я использовал оба метода, на самом деле больше не получает события.У вас есть идея, как это сделать?Заранее спасибо.

1 Ответ

1 голос
/ 20 марта 2014

Вы можете использовать метод addClassFilter, который принимает в качестве аргумента ReferenceType, который (в отличие от версии 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);
}
...