Dubbo Consumer调试中遇到的问题
在使用idea学习dubbo consumer的初始化时,遇到了一个奇怪的问题。consumer初始化时会调用com.alibaba.dubbo.config.ReferenceConfig#get
方法,如下:
public synchronized T get() {
if (destroyed){
throw new IllegalStateException("Already destroyed!");
}
if (ref == null) {
init();
}
return ref;
}
private void init() {
if (initialized) {
return;
}
initialized = true;
checkAndLoadConfig();
ref = createProxy();
}
在debug模式下,走到init方法的第一行代码时,发现initialized的值为true。排查代码发现initialized只在下面的代码中才会赋值为true。这就比较奇怪,为什么initialized在没有赋值的情况下会初始化为true呢? 由于initialized为true,导致不执行下面的crateProxy()方法,ref为null。
但是在run模式下,ref是有值的。debug模式下,如果只在这个方法之后打断点,也是有值的。 大致可以判断是debug模式的影响。
在网上搜了下,发现有大神通过打印日志找到了问题原因。过程很值得学习,所以把原文链接放在了文章的最后。
结论
idea这类编辑器在debug模式下,为了在断点处能显示一个类的实例,就会反射调用实例的toString,导致initialized被设置为true。
参考链接: