在 JAVA 程序有时需要获取当前代码位置, 于是就利用 Thread.currentThread().getStackTrace()
写了下面这个工具类, 用来获取当前执行位置处代码的文件名/类名/方法名/行号.
当然通过 new Throwable().getStackTrace()
也能得到同样信息, 在处理异常时用这种方法还行, 否则需要 new 一个 Throwable, 感觉有点浪费????
至于为什么 CurrentLineInfo.originStackIndex
的值是 2 呢? 这是因为通过自定义的静态方法调用 Thread.currentThread().getStackTrace()
获取当前函数栈时, 已多加了两层方法调用.
比如说在 Main.main()
方法中获取当前行号时, 其调用链为:
Main.main() --> CurrentLineInfo.getLineNumber() --> Thread.getStackStrace()
因为栈是 先入后出 (队列是 先入先出), 所以最初调用位置的函数栈下表是 2.
这一点在调试时也可以看到:
下面是源码和测试:
CurrentLineInfo.java:
package com.example.lineno;
public class CurrentLineInfo {
private static int originStackIndex = 2;
public static String getFileName() {
return Thread.currentThread().getStackTrace()[originStackIndex].getFileName();
}
public static String getClassName() {
return Thread.currentThread().getStackTrace()[originStackIndex].getClassName();
}
public static String getMethodName() {
return Thread.currentThread().getStackTrace()[originStackIndex].getMethodName();
}
public static int getLineNumber() {
return Thread.currentThread().getStackTrace()[originStackIndex].getLineNumber();
}
}
测试代码 Main.java:
package com.example.lineno;
public class Main {
public static void main(String[] args) {
System.out.println(CurrentLineInfo.getFileName());
System.out.println(CurrentLineInfo.getClassName());
System.out.println(CurrentLineInfo.getMethodName());
System.out.println(CurrentLineInfo.getLineNumber());
}
}
测试输出:
FileName: Main.java
ClassName: com.example.lineno.Main
MethodName: main
LineNumber: 8