在 system.out.println 的代码中找到位置

Lex*_*con 5 java reflection

假设我在一个非常大的项目中工作,并且注意到一个空的打印行,所以我假设有一个 System.out.println(""); 位于代码中的某处。除了在整个项目中搜索所有出现的 System.out.println 之外,我将如何尝试找出它的位置?

Kay*_*man 5

您可以实现自己的PrintStream并用于System.setOut替换默认的标准输出。然后要么在类中放置一个调试标记(如果打印空字符串),要么通过调用堆栈打印出方法名称(抛出并捕获异常并获取堆栈信息)。


Ned*_*igg 5

如果您使用的是 Java 8+,Durian有一个StackDumper类,它可以轻松找到给定行的打印位置:

StackDumper.dumpWhenSysOutContains("SomeTrigger")
Run Code Online (Sandbox Code Playgroud)

当打印“SomeTrigger”时,这将被转储到System.err

+----------\
| Triggered by SomeTrigger
| at package.MyClass.myMethod(MyClass.java:62)
| (the rest of the stacktrace)
+----------/
Run Code Online (Sandbox Code Playgroud)

对于你的情况(寻找一个空字符串),它有点复杂:

PrintStream sysOutClean = System.out;
StringPrinter sysOutReplacement = new StringPrinter(StringPrinter.stringsToLines(line -> {
    if (line.isEmpty()) {
        StackDumper.dump("Found empty line");
    }
    sysOutClean.println(line);
}));
System.setOut(sysOutReplacement.toPrintStream());
Run Code Online (Sandbox Code Playgroud)

现在,如果有这样的事情:

System.out.println("ABC");
System.out.println("123");
System.out.println("");
System.out.println("DEF");
Run Code Online (Sandbox Code Playgroud)

然后您的控制台将如下所示:

ABC
123
+----------\
| Found empty line
| at package.MyClass.myMethod(MyClass.java:62)
| (the rest of the stacktrace)
+----------/

DEF
Run Code Online (Sandbox Code Playgroud)