我使用系统属性来实现这一点。
例子
假设我们有这个类:
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
methodA();
}
methodB();
methodA();
}
private static void methodA() {
System.out.println("A");
}
private static void methodB() {
System.out.println("B");
}
}
我们想在methodA() 中添加一个断点,但只在调用methodB() 后停止,而不是在代码中添加额外的变量或使用计数器。
设置属性的断点
首先,让我们在methodB() 中添加一个断点并使其成为条件。在这种情况下,我们将系统属性设置为true。我们不想在methodB() 内暂停,所以条件会返回false:
System.setProperty("enable.methodA.breakpoint", "true");
return false;
请看下面的 GIF:
检查属性的断点
现在,我们在methodA() 中添加一个断点,也带有一个条件。在条件中,我们首先获取设置的系统属性的值:
String p = System.getProperty("enable.methodA.breakpoint", "false");
然后,我们将其解析为布尔值并返回:
return Boolean.valueOf(p).booleanValue();
(注意默认值为"false",所以如果没有设置属性,断点不会暂停。)
在下面的 GIF 中检查这一步:
跑步
现在,如果我们在调试模式下运行这个类,methodA() 的书签只会在调用methodB() 后暂停:
再次禁用断点
如果在methodB() 之后多次调用methodA(),而我们只想检查一次,我们最终可以取消设置该属性。例如,假设我们的main() 方法现在是这样的:
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
methodA();
}
methodB();
methodA();
for (int i = 0; i < 1000; i++) {
methodA();
}
}
我们可以使用这个条件,我们将属性设置回 false 以避免再次在这个断点处停止:
String p =
System.getProperty("enable.methodA.breakpoint", "false");
System.setProperty("enable.methodA.breakpoint", "false");
return Boolean.valueOf(p).booleanValue();
当然,这只是一个简单的例子——天空是这个技巧的极限。