我将使用系统属性来实现这个。
示例
假设我们有这个类:
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:
![Adding first condition to <code>methodB()</code>](https://istack.dev59.com/eE73f.gif)
检查属性的断点
现在,我们向 methodA()
添加一个带有条件的断点。在条件中,我们首先获取设置的系统属性的值:
String p = System.getProperty("enable.methodA.breakpoint", "false");
然后,我们将其解析为布尔值并返回:
return Boolean.valueOf(p).booleanValue();
(请注意,默认值为
"false"
,因此如果未设置该属性,则断点不会暂停。)
请查看下面的GIF中的该步骤:
![Add bookmark that checks system property.](https://istack.dev59.com/xvJ60.gif)
运行
现在,如果我们以调试模式运行这个类,在methodB()
被调用之后,位于methodA()
的书签才会暂停:
![<code>methodA()</code> is only paused after <code>methodB()</code>](https://istack.dev59.com/MbMy8.gif)
禁用断点
如果在调用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();
当然,这只是一个简单的例子 - 这个技巧的应用范围是非常广泛的。