what?IDEA在debug时会自动私自调用我们的代码么?是的,会调用对象的toString()方法。
一般在debug时很难发现这种现象,并且多数情况下调用一下toString()方法没有什么问题(但是一些客户端服务端交互的项目,会有意想不到的问题出现。例如Dubbo的AbstractConfig类,对这个类的debug会导致其子类ReferenceConfig的initialized属性错误的被修改为true,进而无法正确的生成Dubbo代理。),就使我们更不容易察觉。但是今天在debug一个本地模拟基于Netty的RPC的项目时,发现consumer客户端并没有执行任何provider端提供的方法,provider服务端竟然收到了来自客户端的数据,几番排查,发现是idea在debug模式下的私自调用。
provider端:
当收到来自客户端建立的连接的数据时,会执行channelRead方法,这里我们打了日志。
consumer客户端:
客户端rpc调用服务端的DemoService方法,这里我们是debug模式,在方法调用之前打了断点,也就是此时还没有进行sayHello方法的调用,但是我们看下服务端的日志
可以惊奇的发现,在我们「真正」调用对象方法之前,idea已经私自调用了DemoService的toString()方法。
问题发现了,那么如何解决呢?
IDEA在debug时调用toString()方法的情况是可以在配置中关掉的,在idea设置中更改下默认设置就好
取消’toString()’设置的勾选就可以了