【发布时间】:2011-09-22 02:29:37
【问题描述】:
在代码中: System.out.println("myPackage.MyClass");
在 Eclipse 控制台中: myPackage.MyClass.myMethod
我想点击控制台中的输出(myPackage.MyClass.myMethod),它直接显示相应的方法,类似于异常堆栈跟踪发生的情况。有什么想法吗?
【问题讨论】:
在代码中: System.out.println("myPackage.MyClass");
在 Eclipse 控制台中: myPackage.MyClass.myMethod
我想点击控制台中的输出(myPackage.MyClass.myMethod),它直接显示相应的方法,类似于异常堆栈跟踪发生的情况。有什么想法吗?
【问题讨论】:
也许这对其他人来说很清楚,但我发现其他答案令人困惑,尽管是正确的。 Eclipse 控制台将模式 (FileName.java:lineNumber) 解析为指向该文件中该行的链接:
(MyFile.java:2)
正如其他答案所指出的,有很多方法可以将其输出到控制台。行中的位置无关紧要,它只是一个模式匹配。正如 Colin Smith 所示,log4j PatternLayout 可以使用(%F:%L) 来获取文件名和行号。要以编程方式获取文件名和行号,请参阅this question。
该问题询问有关链接到方法的问题,我相信您可以使用 Tonny Madsen 推荐的 consolePatternMatchListeners 方法,并在this question 中进行了更详细的描述。
【讨论】:
异常堆栈跟踪的超链接基于行尾给出的文件名和行号。例如
Stack trace:
org.eclipse.jface.internal.databinding.provisional.BindingException: string property does not have a read method.
at org.eclipse.jface.internal.databinding.internal.beans.JavaBeanObservableValue.doGetValue(JavaBeanObservableValue.java:102)
at org.eclipse.jface.internal.databinding.internal.beans.JavaBeanObservableValue.setValue(JavaBeanObservableValue.java:83)
对于第一个堆栈跟踪,它位于文件 JavaBeanObservableValue.java 的第 102 行。在当前类路径中搜索该文件,因此如果您有多个具有相同名称的类,则始终会找到第一个...
换句话说,如果你想根据你的例子添加扩展超链接,你需要扩展控制台视图一点......
...这可以通过org.eclipse.ui.console.consolePatternMatchListeners 扩展点来完成。使用这个扩展点非常容易,通过查看 JDT 中的示例,您应该能够让您的示例在没有太多工作的情况下工作......
【讨论】:
一个更简单的方法是欺骗控制台为您创建一个链接。格式很简单:
System.out.println("(" + new TestBed().getClass().getSimpleName() + ".java:" + 18 + ")");
显然您可以根据需要在代码中提供类类型和行号。
【讨论】:
Class.getName 将输出规范的类名 - 带有包,因此这仅在您不使用包时才有效(这是错误代码的指标),getSimpleName 应该适用于所有情况
或者,如果你使用 log4j,你可以像这样配置你的 appender:
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m (%F:%L) in %t%n"/>
</layout>
</appender>
如果您也希望它在 IntelliJ IDEA 中工作,您可以使用:
<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m - at %c.%M(%F:%L) in %t%n"/>
【讨论】:
我使用自定义控制台视图并将 IPatternMatchListener 添加到 MessageConsole
console.addPatternMatchListener(...)
使用监听器的一个重要优点是事件提供了创建超链接所需的偏移量。
可以在此处找到实现创建超链接的 IPatternMatchListener 的起点:
最棘手的部分似乎是从文件名中获取完整的文件路径(我不使用记录器)。
可以在此处找到遮阳插件使用的解决方法:
参见方法“dereferenceWindowsLink”
我仍在寻找替代方案。
【讨论】:
这是一个基于其他人的答案的简单包装方法,可用于任何地方获取格式化的字符串,以便 Eclipse 控制台链接到 getSourceCodeLine() 的任何文件中的行 被调用。我还发现在 Eclipse 中打印到 System.err 将显示为 red。
public static String getSourceCodeLine() {
// An index of 1 references the calling method
StackTraceElement ste = new Throwable().getStackTrace()[1];
return "(" + ste.getFileName() + ":" + ste.getLineNumber() + ")";
}
public static void main( String[] args )
System.out.println("Here's a link to " + getSourceCodeLine());
System.err.println("And a red link to " + getSourceCodeLine());
}
【讨论】:
要添加到其他答案,您可以使用这种古怪的格式链接到特定的课程:
java.util..(List.java:100)java.awt..(List.java:100)
【讨论】: