在JDI中,有一个API可以从JPDA使用的JVM中的已处理事件中排除事件。这是使用:
完成的addExclusionFilter(String)
排除某些模式;例如addExclusionFilter("java.*")
addClassFilter(String)
包含一些模式;例如addClassFilter("java.util.*")
现在,我需要两者。我需要排除来自"java.*"
的所有活动,但我需要接收来自"java.util.Iterator"
的活动。
另请注意,例如java.util.Iterator
是由java.util.AbstractList
中的某个私有类实现的接口。我们如何向java.util.Iterator
收到此类活动?
当我使用这两种方法时,我实际上不再次接收事件。你知道怎么做吗?提前致谢。
答案 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);
}