钩入 System.out.println();并修改

Hook into System.out.println(); and modify

我想修改 System.out.println(); 打印的输出。这怎么可能? 有可能 - 我在 Bukkit/Craftbukkit 中看到过。如果插件使用 System.out.println(String string) 打印字符串; Bukkit 将 time/date 和日志状态添加到字符串中。 我也想像Bukkit一样做。

您可以更改用作标准输出的PrintStream

System.setOut(PrintStream out)

创建您自己的 PrintStream 实现,它将您想要的任何额外信息打印到(旧的)标准输出,并将其设置为:

System.setOut(myStream);

示例:

以下示例在使用 PrintStream.println(String x) 方法打印的每个 String 之前打印当前时间毫秒:

PrintStream myStream = new PrintStream(System.out) {
    @Override
    public void println(String x) {
        super.println(System.currentTimeMillis() + ": " + x);
    }
};
System.setOut(myStream);
System.out.println("Hello World!");

输出:

1420553422337: Hello World!

注:

此示例仅覆盖 PrintStream.println(String x) 方法,因此调用 PrintStream 的其他打印方法不会将时间戳添加到输出中。

PrintStream print= new PrintStream(System.out) {
    @Override
    public void println(String yourString) {
        super.println(System.currentTimeMillis()+ ": " + yourString);
    }

};

print.println("your String");

这个问题已经回答了,但是,我想添加一个很好的跟踪打印的方法。

PrintStream myStream = new PrintStream(System.out) {
        @Override
        public void println(String line) {
            StackTraceElement element = new Exception().getStackTrace()[1];
            super.println("("+element.getFileName()+":"+element.getLineNumber()+") "+line);
        }
    };

System.setOut(myStream);

现在,当您打印某些内容时,它会显示为“(File:linenumber) 文本”,在许多编辑器中,您只需单击它即可跳转到该位置。一直获取堆栈跟踪可能非常昂贵,因此最好只在调试期间使用它。