查找打印电话的来源

Boa*_*ann 2 java debugging

我正在调试一个Java应用程序,它在启动期间有助于将其打印到控制台大约十几次:

java.awt.Dimension[width=140,height=122]
Run Code Online (Sandbox Code Playgroud)

我想关闭它,但我不知道它来自哪里.应用程序是巨大的,我不太了解它.我可以通过逐步执行代码找到罪魁祸首,但我想知道有更聪明的方法吗?

Boa*_*ann 6

我发现了我的违规打印声明(在getPreferredSize()方法中),但我也发现了一个更通用的解决方案.理论上,通过替换System.out使用System.setOut它可以在发生时捕获打印语句.

这不完全可靠,因为:(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!");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)