IDEA中Debugger模式下的toString()方法
程序员文章站
2022-06-07 20:07:50
...
最近在看Zxing的源码,使用IDEA打断点调试时,发现了一个问题, toString() 方法会自动执行,找不到谁调用的它,就百思不得其解.
问题
- 类 BinaryBitmap 中的 toString 方法里面有个赋值语句,给变量 matrix 赋值.
- 在调试过程中,我没有调用该 toString 方法,但断点结果却显示 matrix 有值,而且就是 toString 中的执行结果,
- 就很纳闷,难道 toString 方法是什么特殊体质?
- 于是自己仿造类 BinaryBitmap 写了个测试类,看到底是什么原因.
测试代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestToString {
private List<String> list = null;
private Map<String, String> map = null;
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("xiaoming");
list.add("xiaohua");
TestToString testToString = new TestToString(list);
// 直接运行结果为null, debugg时会显示 datou
System.out.println(testToString.map);
}
public TestToString(List<String> list) {
this.list = list;
}
@Override
public String toString() {
System.out.println("toString");
if(map == null) {
Map<String, String> hashMap = new HashMap<>();
hashMap.put("name", "datou");
map = hashMap;
}
return list.toString() + map.toString();
}
}
运行结果
- 在第17行打断点,debugger模式下会发现变量 map 是有值的,且执行了 toString 方法中的打印语句.
- 如果直接运行程序,会发现变量 map 为 null, toString 中的打印语句也没有执行.
- 所以猜测 toString 方法自动执行和 debugger 模式有关.
- 在后面多次测试时,发现一个有趣的现象,在 debugger 模式下,鼠标移动到变量 testToString 上面,IDEA 会有一个弹窗,显示该变量的信息,然后控制台就会输出一条 toString 方法中的打印语句.
总结
- 最后发现 toString 方法其实是 IDEA 的调试工具调用的,因为它需要调用 toString 方法来在弹框中展示这个变量的信息,并且不会跳转到 toString 方法中的断点.
- 所以 toString 方法只能由它所属对象来调用是对的,不会出现自动调用的情况,
- 至于 IDEA 的 Debugger 工具是怎么调用 toString 的,就不清楚了,可能是通过反射吧.