IDEA中Debugger模式下的toString()方法

最近在看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 的,就不清楚了,可能是通过反射吧.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值