简介

        本文介绍Java如何打印文件名、类名、方法名、行号。

IDE工具

Idea:可以通过快捷键模板生成打印信息:File=> Settings=> Editor=> Live Templates=>

本处我将打印类名、方法、行号的快捷键设为:soutd

线程栈

文件名:Thread.currentThread().getStackTrace()[1].getFileName()

类名:Thread.currentThread().getStackTrace()[1].getClassName()

方法名:Thread.currentThread().getStackTrace()[1].getMethodName()

文件名:Thread.currentThread().getStackTrace()[1].getLineNumber()

例如:可以在想要调试的地方直接调用以下语句

System.out.println(String.format("%s : %s : %s : %d", 
Thread.currentThread().getStackTrace()[1].getFileName(),
Thread.currentThread().getStackTrace()[1].getClassName(),
Thread.currentThread().getStackTrace()[1].getMethodName(),
Thread.currentThread().getStackTrace()[1].getLineNumber()));

可以直接将上边这个代码写到template,以dbg为快捷键。注意:取消选中:Use code formatter

讲解

Thread.currentThread().getStackTrace()返回值:StackTraceElement[],这是一个数组。

第0项:当前线程信息

第1项:当前方法执行的堆栈

第2项:调用者的堆栈

第1项和第2项的讲解

        如果想要把这个调试语句封装为类,则下标就得是2。代码如下

public class DBG {
public static String getFileName() {
return Thread.currentThread().getStackTrace()[2].getFileName();
}

public static String getClassName() {
return Thread.currentThread().getStackTrace()[2].getClassName();
}
public static String getMethodName() {
return Thread.currentThread().getStackTrace()[2].getMethodName();
}

public static int getLineNumber() {
return Thread.currentThread().getStackTrace()[2].getLineNumber();
}

public static void printAll(String args[]) {
System.out.println(getFileName() + " :" +
getClassName() + " :" +
getMethodName() + " :" +
getLineNumber());
}
}