如何找到打印调用的位置?

我正在使用 IntelliJ 开发一个旧的 Java 应用程序项目,源代码很大。一个类有一个方法,可以在播放时打印每帧视频的信息。我想禁用此代码进行打印,但我不知道它来自哪里或类名是什么。当我直接搜索字符串时它没有出现。有没有更聪明的方法来找到打印调用的位置?

(来自评论):

输出线是 [isDeveloper true]------ get duration(=3.552653) is test impl ------


红糖糍粑
浏览 154回答 2
2回答

蛊毒传说

替换System.out为您自己的PrintStream,使用System.setOut(),使其匹配(不)所需的输出,在匹配子句上放置一个断点,并查看堆栈跟踪。由于PrintStream有很多很多方法,而不是覆盖在生成(不)期望输出时可能调用的所有可能方法,让我们将所有PrintStream输出定向到FilterOutputStream我们自己设计的 a ;那么我们应该只需要覆盖一个方法,但是我们需要重建我们的字符串。例子:class Prospector extends FilterOutputStream {    int count = 0;    private OutputStream original;    public Prospector(OutputStream out) {        super(out);        original = out;    }    @Override    public void write(byte[] b, int off, int len) throws IOException {        String buffer = new String(b, off, len, StandardCharsets.ISO_8859_1);        if (buffer.contains("]------ get duration(=")) {            if (count == 0) {                new Exception().printStackTrace(original);            }            count++;  // Set breakpoint here        }        super.write(b, off, len);    }}当程序启动时,安装一个新的PrintStream包装原件在我们的Prospector:System.setOut(new PrintStream(new Prospector(System.out)));在指定的行上设置断点。当程序在断点处停止时,查找堆栈跟踪以找到生成输出的类/方法。当神秘类生成您的目标线时,可能类似于...System.out.format("[%s %s]------ get duration(=%f) is %s -------%n",    "isDeveloper", "true", 3.552653, "test impl");...这个方法可以被多次调用,buffer包含行的各个部分,连续。在上述情况下,这将是:"[""isDeveloper"" ""true""]------ get duration(=""3.552653"") is ""test impl"" -------""\n"理想情况下,]------ get duration(=应该足够独特以找到您正在寻找的类/方法,但您可以根据需要进行调整。也可以将整个文本格式化为一个String,并在一次调用中打印出来。这就是为什么.contains(...)用于匹配所需的输出。

慕村9548890

我认为按 Ctrl+鼠标单击所需的变量或方法充当源的超链接应该可以解决问题(在 IntelliJ 上)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java