我調試Java應用程序在啓動過程中有益打印此約了十幾次控制檯:查找打印呼叫源
java.awt.Dimension[width=140,height=122]
我要關閉它,但我不知道它的到來從。該應用程序是巨大的,我不太瞭解它。我可能會在運行代碼時逐步找到罪魁禍首,但我想知道有沒有更聰明的方法?
我調試Java應用程序在啓動過程中有益打印此約了十幾次控制檯:查找打印呼叫源
java.awt.Dimension[width=140,height=122]
我要關閉它,但我不知道它的到來從。該應用程序是巨大的,我不太瞭解它。我可能會在運行代碼時逐步找到罪魁禍首,但我想知道有沒有更聰明的方法?
您必須在代碼的某處打印Dimension
類的對象。你所看到的輸出:
java.awt.Dimension[width=140,height=122]
來當Dimension
類的toString
方法將被調用。下面是從toString
類Dimension
來源:
public String toString() {
return getClass().getName() + "[width=" + width + ",height=" + height + "]";
}
因此,尋找Dimension
類對象在你的代碼,尤其是在System.out.println
。
我發現我的違規打印語句(在getPreferredSize()方法中),但我也找到了更通用的解決方案。通過使用System.setOut
代替System.out
理論上,它可能會在發生時發現打印聲明。
這不是完全可靠的,因爲:(1)PrintStream類具有許多用於不同數據類型的打印方法,並且沒有很好的單一方法來覆蓋。真正輸出的方法是私有的。 (2)如果願意,代碼可以將消息拆分爲單個字符,因此檢查String.contains()
時不會有簡單的方法。
儘管如此,作爲一個快速調試破解,這似乎很好地工作:
System.setOut(new java.io.PrintStream(
new java.io.FileOutputStream(java.io.FileDescriptor.out)) {
@Override
public void print(String s) {
super.print(s);
if (s.contains("java.awt.Dimension")) {
throw new RuntimeException("Found you!");
}
}
});