有没有办法在Eclipse控制台中显示行号?
我的目的是在Eclipse控制台中显示产生输出的文件/行号,而不是消息的串行编号(尽管这也可能是一个有趣的问题)。
我正在寻找类似于Chrome浏览器的javascript控制台,其中每一行都有一个链接,可以将您带到打印它的功能。
答案 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控制台:
我认为这是一个黑客攻击,除了随意调试之外我不会用它做任何事情。
答案 1 :(得分:0)
首先,我会用自己的语言重新解释您的问题,以便检查我的问题是否正确: 您希望将所有控制台输出链接到生成它的源代码。
在这种情况下,如果不使用某些修改标准库(System.out和System.err),则无法实现。这样的代码可能会使用当前的堆栈跟踪(参见例如Is there a way to dump a stack trace without throwing an exception in java?)来确定调用print语句的代码(和行号)。 下一步是创建一个eclipse插件,它使用收集的信息跳转到确定的行(或者让eclipse认为它正在显示堆栈跟踪)。