在Eclipse Console中包含与System.out.print语句对应的文件名/行号

时间:2015-05-25 11:11:21

标签: java eclipse

有没有办法在Eclipse控制台中显示行号?

我的目的是在Eclipse控制台中显示产生输出的文件/行号,而不是消息的串行编号(尽管这也可能是一个有趣的问题)。

我正在寻找类似于Chrome浏览器的javascript控制台,其中每一行都有一个链接,可以将您带到打印它的功能。

2 个答案:

答案 0 :(得分:6)

您可以创建一个自定义PrintStream来检查当前堆栈跟踪并在输出中包含文件/行号。然后,您可以使用System.setOut / System.setErr使所有stdout / stderr输出包含此信息。

通过正确格式化,Eclipse将把它作为堆栈跟踪元素并将其生成链接。

这是一个完整的演示:

public class Main {
    public static void main(String args[]) {
        System.setOut(new java.io.PrintStream(System.out) {

            private StackTraceElement getCallSite() {
                for (StackTraceElement e : Thread.currentThread()
                        .getStackTrace())
                    if (!e.getMethodName().equals("getStackTrace")
                            && !e.getClassName().equals(getClass().getName()))
                        return e;
                return null;
            }

            @Override
            public void println(String s) {
                println((Object) s);
            }

            @Override
            public void println(Object o) {
                StackTraceElement e = getCallSite();
                String callSite = e == null ? "??" :
                    String.format("%s.%s(%s:%d)",
                                  e.getClassName(),
                                  e.getMethodName(),
                                  e.getFileName(),
                                  e.getLineNumber());
                super.println(o + "\t\tat " + callSite);
            }
        });

        System.out.println("Hello world");
        printStuff();
    }

    public static void printStuff() {
        System.out.println("More output!");
    }
}

Eclipse控制台:

enter image description here

我认为这是一个黑客攻击,除了随意调试之外我不会用它做任何事情。

答案 1 :(得分:0)

首先,我会用自己的语言重新解释您的问题,以便检查我的问题是否正确: 您希望将所有控制台输出链接到生成它的源代码。

在这种情况下,如果不使用某些修改标准库(System.out和System.err),则无法实现。这样的代码可能会使用当前的堆栈跟踪(参见例如Is there a way to dump a stack trace without throwing an exception in java?)来确定调用print语句的代码(和行号)。 下一步是创建一个eclipse插件,它使用收集的信息跳转到确定的行(或者让eclipse认为它正在显示堆栈跟踪)。